diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3d21822287b6b..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 / 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 20ae4c8f3e17e..9faed9a44dd73 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 11a64fd143362..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: @@ -172,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::" 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 ef6b86be43e09..5de320ee91c0e 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 @@ -35,4 +35,4 @@ jobs: php-version: "7.2" - name: Lint - run: find ./src/Symfony/Bridge/PhpUnit -name '*.php' | grep -v -e /Tests/ -e /Attribute/ -e /Extension/ -e /Metadata/ -e ForV7 -e ForV8 -e ForV9 -e ConstraintLogicTrait | parallel -j 4 php -l {} + run: find ./src/Symfony/Bridge/PhpUnit -name '*.php' | grep -v -e /Tests/ -e /Attribute/ -e /Extension/ -e /Metadata/ -e ForV7 -e ForV8 -e ForV9 -e ConstraintLogicTrait -e SymfonyExtension | parallel -j 4 php -l {} 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..1033e761a2d0b 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 @@ -26,38 +26,45 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@3e15ea8318eee9b333819ec77a36aca8d39df13e # v1.1.1 + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 with: results_file: results.sarif results_format: sarif - # (Optional) Read-only PAT token. Uncomment the `repo_token` line below if: + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: # - you want to enable the Branch-Protection check on a *public* repository, or - # - you are installing Scorecards on a *private* repository - # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. - # repo_token: ${{ secrets.SCORECARD_READ_TOKEN }} - - # Publish the results for public repositories to enable scorecard badges. For more details, see - # https://github.com/ossf/scorecard-action#publishing-results. - # For private repositories, `publish_results` will automatically be set to `false`, regardless - # of the value entered here. + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. publish_results: true + # (Optional) Uncomment file_mode if you have a .gitattributes with files marked export-ignore + # file_mode: git + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: SARIF file path: results.sarif retention-days: 5 - # Upload the results to GitHub's code scanning dashboard. + # Upload the results to GitHub's code scanning dashboard (optional). + # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@5f532563584d71fdef14ee64d17bafb34f751ce5 # v1.0.26 + uses: github/codeql-action/upload-sarif@v3 with: sarif_file: results.sarif diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index d8d36c4e7e039..578b225ea6f17 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -21,7 +21,7 @@ jobs: name: Unit Tests env: - extensions: amqp,apcu,igbinary,intl,mbstring,memcached,redis,relay + extensions: amqp,apcu,brotli,igbinary,intl,mbstring,memcached,redis,relay,zstd strategy: matrix: @@ -33,14 +33,11 @@ jobs: mode: low-deps - php: '8.3' - php: '8.4' - # brotli and zstd extensions are optional, when not present the commands will be used instead, - # we must test both scenarios - extensions: amqp,apcu,brotli,igbinary,intl,mbstring,memcached,redis,relay,zstd - php: '8.5' #mode: experimental fail-fast: false - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout @@ -101,7 +98,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 @@ -139,10 +136,6 @@ jobs: echo SYMFONY_REQUIRE=">=$([ '${{ matrix.mode }}' = low-deps ] && echo 5.4 || echo $SYMFONY_VERSION)" >> $GITHUB_ENV [[ "${{ matrix.mode }}" = *-deps ]] && mv composer.json.phpunit composer.json || true - if [[ "${{ matrix.mode }}" = low-deps ]]; then - echo SYMFONY_PHPUNIT_REQUIRE="nikic/php-parser:^4.18" >> $GITHUB_ENV - fi - - name: Install dependencies run: | echo "::group::composer update" @@ -237,6 +230,12 @@ jobs: run: | script -e -c './phpunit --group tty' /dev/null + - name: Run AssetMapper without ext-brotli nor ext-zstd + if: "! matrix.mode" + run: | + sudo rm /etc/php/*/cli/conf.d/*-{brotli,zstd}.ini + ./phpunit src/Symfony/Component/AssetMapper + - name: Run tests with SIGCHLD enabled PHP if: "matrix.php == '8.2' && ! matrix.mode" run: | diff --git a/CHANGELOG-7.2.md b/CHANGELOG-7.2.md index 0bb8758194576..d6d188669de42 100644 --- a/CHANGELOG-7.2.md +++ b/CHANGELOG-7.2.md @@ -7,6 +7,58 @@ 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) diff --git a/CHANGELOG-7.3.md b/CHANGELOG-7.3.md new file mode 100644 index 0000000000000..bee0295a98485 --- /dev/null +++ b/CHANGELOG-7.3.md @@ -0,0 +1,248 @@ +CHANGELOG for 7.3.x +=================== + +This changelog references the relevant changes (bug and security fixes) done +in 7.3 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.3.0...v7.3.1 + +* 7.3.0 (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 #60542 [Webhook] Fix controller service name (HypeMC) + +* 7.3.0-RC1 (2025-05-25) + + * bug #60529 [AssetMapper] Fix SequenceParser possible infinite loop (smnandre) + * bug #60532 [Routing] Fix inline default `null` (HypeMC) + * bug #60535 [DoctrineBridge] Fix resetting the manager when using native lazy objects (HypeMC) + * bug #60500 [PhpUnitBridge] Fix cleaning up mocked features with attributes (HypeMC) + * bug #60330 [FrameworkBundle] skip messenger deduplication middleware registration when no "default" lock is configured (lyrixx) + * bug #60494 [Messenger] fix: Add argument as integer (overexpOG) + * bug #60524 [Notifier] Fix Clicksend transport (BafS) + * bug #60479 [FrameworkBundle] object mapper service definition without form (soyuka) + * bug #60478 [Validator] add missing `$extensions` and `$extensionsMessage` to the `Image` constraint (xabbuh) + * bug #60491 [ObjectMapper] added earlier skip to allow if=false when using source mapping (maciekpaprocki) + * 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 #60489 [FrameworkBundle] Fix activation strategy of traceable decorators (nicolas-grekas) + * feature #60475 [Validator] Revert Slug constraint (wouterj) + * feature #60105 [JsonPath] Add `JsonPathAssertionsTrait` and related constraints (alexandre-daubois) + * 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 #60426 [Validator] let the `SlugValidator` accept `AsciiSlugger` results (xabbuh) + * bug #60421 [VarExporter] Fixed lazy-loading ghost objects generation with property hooks (cheack) + * bug #60419 [SecurityBundle] normalize string values to a single ExposeSecurityLevel instance (xabbuh) + * bug #60266 [Security] Exclude remember_me from default login authenticators (santysisi) + * bug #60407 [Console] Invokable command `#[Option]` adjustments (kbond) + * 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 #60401 Passing more than one Security attribute is not supported (santysisi) + +* 7.3.0-BETA2 (2025-05-10) + + * bug #58643 [SecurityBundle] Use Composer `InstalledVersions` to check if flex is installed (andyexeter) + * feature #54276 [Workflow] Add support for executing custom workflow definition validators during the container compilation (lyrixx) + * feature #52981 [FrameworkBundle] Make `ValidatorCacheWarmer` and `SerializeCacheWarmer` use `kernel.build_dir` instead of `kernel.cache_dir` (Okhoshi) + * feature #54384 [TwigBundle] Use `kernel.build_dir` to store the templates known at build time (Okhoshi) + * bug #60275 [DoctrineBridge] Fix UniqueEntityValidator Stringable identifiers (GiuseppeArcuti, wkania) + * feature #59602 [Console] `#[Option]` rules & restrictions (kbond) + * feature #60389 [Console] Add support for `SignalableCommandInterface` with invokable commands (HypeMC) + * bug #60293 [Messenger] fix asking users to select an option if `--force` option is used in `messenger:failed:retry` command (W0rma) + * bug #60392 [DependencyInjection][FrameworkBundle] Fix precedence of `App\Kernel` alias and ignore `container.excluded` tag on synthetic services (nicolas-grekas) + * bug #60379 [Security] Avoid failing when PersistentRememberMeHandler handles a malformed cookie (Seldaek) + * bug #60308 [Messenger] Fix integration with newer versions of Pheanstalk (HypeMC) + * 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 #60366 [Console] Set description as first parameter to `Argument` and `Option` attributes (alamirault) + * bug #60361 [Console] Ensure overriding `Command::execute()` keeps priority over `__invoke()` (GromNaN) + * feature #60028 [ObjectMapper] Condition to target a specific class (soyuka) + * feature #60344 [Console] Use kebab-case for auto-guessed input arguments/options names (chalasr) + * bug #60340 [String] fix EmojiTransliterator return type compatibility with PHP 8.5 (xabbuh) + * bug #60322 [FrameworkBundle] drop the limiters option for non-compound rater limiters (xabbuh) + +* 7.3.0-BETA1 (2025-05-02) + + * feature #60232 Add PHP config support for routing (fabpot) + * feature #60102 [HttpFoundation] Add `UriSigner::verify()` that throws named exceptions (kbond) + * feature #60222 [FrameworkBundle][HttpFoundation] Add Clock support for `UriSigner` (kbond) + * feature #60226 [Uid] Add component-specific exception classes (rela589n) + * feature #60163 [TwigBridge] Allow attachment name to be set for inline images (aleho) + * feature #60186 [DependencyInjection] Add "when" argument to #[AsAlias] (Zuruuh) + * feature #60195 [Workflow] Deprecate `Event::getWorkflow()` method (lyrixx) + * feature #60193 [Workflow] Add a link to mermaid.live from the profiler (lyrixx) + * feature #60188 [JsonPath] Add two utils methods to `JsonPath` builder (alexandre-daubois) + * feature #60018 [Messenger] Reset peak memory usage for each message (TimWolla) + * feature #60155 [FrameworkBundle][RateLimiter] compound rate limiter config (kbond) + * feature #60171 [FrameworkBundle][RateLimiter] deprecate `RateLimiterFactory` alias (kbond) + * feature #60139 [Runtime] Support extra dot-env files (natepage) + * feature #60140 Notifier mercure7.3 (ernie76) + * feature #59762 [Config] Add `NodeDefinition::docUrl()` (alexandre-daubois) + * feature #60099 [FrameworkBundle][RateLimiter] default `lock_factory` to `auto` (kbond) + * feature #60112 [DoctrineBridge] Improve exception message when `EntityValueResolver` gets no mapping information (MatTheCat) + * feature #60103 [Console] Mark `AsCommand` attribute as ``@final`` (Somrlik, GromNaN) + * feature #60069 [FrameworkBundle] Deprecate setting the `collect_serializer_data` to `false` (mtarld) + * feature #60087 [TypeInfo] add TypeFactoryTrait::arrayKey() (xabbuh) + * feature #42124 [Messenger] Add `$stamps` parameter to `HandleTrait::handle` (alexander-schranz) + * feature #58200 [Notifier] Deprecate sms77 Notifier bridge (MrYamous) + * feature #58380 [WebProfilerBundle] Update the logic that minimizes the toolbar (javiereguiluz) + * feature #60039 [TwigBridge] Collect all deprecations with `lint:twig` command (Fan2Shrek) + * feature #60081 [FrameworkBundle] Enable controller service with `#[Route]` attribute (GromNaN) + * feature #60076 [Console] Deprecate returning a non-int value from a `\Closure` function set via `Command::setCode()` (yceruto) + * feature #59655 [JsonPath] Add the component (alexandre-daubois) + * feature #58805 [TwigBridge][Validator] Add the Twig constraint and its validator (sfmok) + * feature #54275 [Messenger] [Amqp] Add default exchange support (ilyachase) + * feature #60052 [Mailer][TwigBridge] Revert "Add support for translatable objects" (kbond) + * feature #59967 [Mailer][TwigBridge] Add support for translatable subject (norkunas) + * feature #58654 [FrameworkBundle] Binding for Object Mapper component (soyuka) + * feature #60040 [Messenger] Use newer version of Beanstalkd bridge library (HypeMC) + * feature #52748 [TwigBundle] Enable `#[AsTwigFilter]`, `#[AsTwigFunction]` and `#[AsTwigTest]` attributes to configure runtime extensions (GromNaN) + * feature #59831 [Mailer][Mime] Refactor S/MIME encryption handling in `SMimeEncryptionListener` (Spomky) + * feature #59981 [TypeInfo] Add `ArrayShapeType::$sealed` (mtarld) + * feature #51741 [ObjectMapper] Object to Object mapper component (soyuka) + * feature #57309 [FrameworkBundle][HttpKernel] Allow configuring the logging channel per type of exceptions (Arkalo2) + * feature #60007 [Security] Add methods param in IsCsrfTokenValid attribute (Oviglo) + * feature #59900 [DoctrineBridge] add new `DatePointType` Doctrine type (garak) + * feature #59904 [Routing] Add alias in `{foo:bar}` syntax in route parameter (eltharin) + * feature #59978 [Messenger] Add `--class-filter` option to the `messenger:failed:remove` command (arnaud-deabreu) + * feature #60024 [Console] Add support for invokable commands in `LockableTrait` (yceruto) + * feature #59813 [Cache] Enable namespace-based invalidation by prefixing keys with backend-native namespace separators (nicolas-grekas) + * feature #59902 [PropertyInfo] Deprecate `Type` (mtarld, chalasr) + * feature #59890 [VarExporter] Leverage native lazy objects (nicolas-grekas) + * feature #54545 [DoctrineBridge] Add argument to `EntityValueResolver` to set type aliases (NanoSector) + * feature #60011 [DependencyInjection] Enable multiple attribute autoconfiguration callbacks on the same class (GromNaN) + * feature #60020 [FrameworkBundle] Make `ServicesResetter` autowirable (lyrixx) + * feature #59929 [RateLimiter] Add `CompoundRateLimiterFactory` (kbond) + * feature #59993 [Form] Add input with `string` value in `MoneyType` (StevenRenaux) + * feature #59987 [FrameworkBundle] Auto-exclude DI extensions, test cases, entities and messenger messages (nicolas-grekas) + * feature #59827 [TypeInfo] Add `ArrayShapeType` class (mtarld) + * feature #59909 [FrameworkBundle] Add `--method` option to `debug:router` command (santysisi) + * feature #59913 [DependencyInjection] Leverage native lazy objects for lazy services (nicolas-grekas) + * feature #53425 [Translation] Allow default parameters (Jean-Beru) + * feature #59464 [AssetMapper] Add `--dry-run` option on `importmap:require` command (chadyred) + * feature #59880 [Yaml] Add the `Yaml::DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES` flag to enforce double quotes around string values (dkarlovi) + * feature #59922 [Routing] Add `MONGODB_ID` to requirement patterns (GromNaN) + * feature #59842 [TwigBridge] Add Twig `field_id()` form helper (Legendary4226) + * feature #59869 [Cache] Add support for `valkey:` / `valkeys:` schemes (nicolas-grekas) + * feature #59862 [Messenger] Allow to close the transport connection (andrew-demb) + * feature #59857 [Cache] Add `\Relay\Cluster` support (dorrogeray) + * feature #59863 [JsonEncoder] Rename the component to `JsonStreamer` (mtarld) + * feature #52749 [Serializer] Add discriminator map to debug commmand output (jschaedl) + * feature #59871 [Form] Add support for displaying nested options in `DebugCommand` (yceruto) + * feature #58769 [ErrorHandler] Add a command to dump static error pages (pyrech) + * feature #54932 [Security][SecurityBundle] OIDC discovery (vincentchalamon) + * feature #58485 [Validator] Add `filenameCharset` and `filenameCountUnit` options to `File` constraint (IssamRaouf) + * feature #59828 [Serializer] Add `defaultType` to `DiscriminatorMap` (alanpoulain) + * feature #59570 [Notifier][Webhook] Add Smsbox support (alanzarli) + * feature #50027 [Security] OAuth2 Introspection Endpoint (RFC7662) (Spomky) + * feature #57686 [Config] Allow using an enum FQCN with `EnumNode` (alexandre-daubois) + * feature #59588 [Console] Add a Tree Helper + multiple Styles (smnandre) + * feature #59618 [OptionsResolver] Deprecate defining nested options via `setDefault()` use `setOptions()` instead (yceruto) + * feature #59805 [Security] Improve DX of recent additions (nicolas-grekas) + * feature #59822 [Messenger] Add options to specify SQS queue attributes and tags (TrePe0) + * feature #59290 [JsonEncoder] Replace normalizers by value transformers (mtarld) + * feature #59800 [Validator] Add support for closures in `When` (alexandre-daubois) + * feature #59814 [Framework] Deprecate the `framework.validation.cache` config option (alexandre-daubois) + * feature #59804 [TypeInfo] Add type alias support (mtarld) + * feature #59150 [Security] Allow using a callable with `#[IsGranted]` (alexandre-daubois) + * feature #59789 [Notifier] [Bluesky] Return the record CID as additional info (javiereguiluz) + * feature #59526 [Messenger] [AMQP] Add TransportMessageIdStamp logic for AMQP (AurelienPillevesse) + * feature #59771 [Security] Add ability for voters to explain their vote (nicolas-grekas) + * feature #59768 [Messenger][Process] add `fromShellCommandline` to `RunProcessMessage` (Staormin) + * feature #59377 [Notifier] Add Matrix bridge (chii0815) + * feature #58488 [Serializer] Fix deserializing XML Attributes into string properties (Hanmac) + * feature #59657 [Console] Add markdown format to Table (amenk) + * feature #59274 [Validator] Allow Unique constraint validation on all elements (Jean-Beru) + * feature #59704 [DependencyInjection] Add `Definition::addExcludedTag()` and `ContainerBuilder::findExcludedServiceIds()` for auto-discovering value-objects (GromNaN) + * feature #49750 [FrameworkBundle] Allow to pass signals to `StopWorkerOnSignalsListener` in XML config and as plain strings (alexandre-daubois) + * feature #59479 [Mailer] [Smtp] Add DSN param to enforce TLS/STARTTLS (ssddanbrown) + * feature #59562 [Security] Support hashing the hashed password using crc32c when putting the user in the session (nicolas-grekas) + * feature #58501 [Mailer] Add configuration for dkim and smime signers (elias-playfinder, eliasfernandez) + * feature #52181 [Security] Ability to add roles in `form_login_ldap` by ldap group (Spomky) + * feature #59712 [DependencyInjection] Don't skip classes with private constructor when autodiscovering (nicolas-grekas) + * feature #50797 [FrameworkBundle][Validator] Add `framework.validation.disable_translation` option (alexandre-daubois) + * feature #49652 [Messenger] Add `bury_on_reject` option to Beanstalkd bridge (HypeMC) + * feature #51744 [Security] Add a normalization step for the user-identifier in firewalls (Spomky) + * feature #54141 [Messenger] Introduce `DeduplicateMiddleware` (VincentLanglet) + * feature #58546 [Scheduler] Add MessageHandler result to the `PostRunEvent` (bartholdbos) + * feature #58743 [HttpFoundation] Streamlining server event streaming (yceruto) + * feature #58939 [RateLimiter] Add `RateLimiterFactoryInterface` (alexandre-daubois) + * feature #58717 [HttpKernel] Support `Uid` in `#[MapQueryParameter]` (seb-jean) + * feature #59634 [Validator] Add support for the `otherwise` option in the `When` constraint (alexandre-daubois) + * feature #59670 [Serializer] Add `NumberNormalizer` (valtzu) + * feature #59679 [Scheduler] Normalize `TriggerInterface` as `string` (valtzu) + * feature #59641 [Serializer] register named normalizer & denormalizer aliases (mathroc) + * feature #59682 [Security] Deprecate UserInterface & TokenInterface's `eraseCredentials()` (chalasr, nicolas-grekas) + * feature #59667 [Notifier] [Bluesky] Allow to attach website preview card (ppoulpe) + * feature #58300 [Security][SecurityBundle] Show user account status errors (core23) + * feature #59630 [FrameworkBundle] Add support for info on `ArrayNodeDefinition::canBeEnabled()` and `ArrayNodeDefinition::canBeDisabled()` (alexandre-daubois) + * feature #59612 [Mailer] Add attachments support for Sweego Mailer Bridge (welcoMattic) + * feature #59302 [TypeInfo] Deprecate `CollectionType` as list and not as array (mtarld) + * feature #59481 [Notifier] Add SentMessage additional info (mRoca) + * feature #58819 [Routing] Allow aliases in `#[Route]` attribute (damienfern) + * feature #59004 [AssetMapper] Detect import with a sequence parser (smnandre) + * feature #59601 [Messenger] Add keepalive support (silasjoisten) + * feature #59536 [JsonEncoder] Allow to warm up object and list (mtarld) + * feature #59565 [Console] Deprecating Command getDefaultName and getDefaultDescription methods (yceruto) + * feature #59473 [Console] Add broader support for command "help" definition (yceruto) + * feature #54744 [Validator] deprecate the use of option arrays to configure validation constraints (xabbuh) + * feature #59493 [Console] Invokable command adjustments (yceruto) + * feature #59482 [Mailer] [Smtp] Add DSN option to make SocketStream bind to IPv4 (quilius) + * feature #57721 [Security][SecurityBundle] Add encryption support to OIDC tokens (Spomky) + * feature #58599 [Serializer] Add xml context option to ignore empty attributes (qdequippe) + * feature #59368 [TypeInfo] Add `TypeFactoryTrait::fromValue` method (mtarld) + * feature #59401 [JsonEncoder] Add `JsonEncodable` attribute (mtarld) + * feature #59123 [WebProfilerBundle] Extend web profiler listener & config for replace on ajax requests (chr-hertel) + * feature #59477 [Mailer][Notifier] Add and use `Dsn::getBooleanOption()` (OskarStark) + * feature #59474 [Console] Invokable command deprecations (yceruto) + * feature #59340 [Console] Add support for invokable commands and input attributes (yceruto) + * feature #59035 [VarDumper] Add casters for object-converted resources (alexandre-daubois) + * feature #59225 [FrameworkBundle] Always display service arguments & deprecate `--show-arguments` option for `debug:container` (Florian-Merle) + * feature #59384 [PhpUnitBridge] Enable configuring mock namespaces with attributes (HypeMC) + * feature #59370 [HttpClient] Allow using HTTP/3 with the `CurlHttpClient` (MatTheCat) + * feature #50334 [FrameworkBundle][PropertyInfo] Wire the `ConstructorExtractor` class (HypeMC) + * feature #59354 [OptionsResolver] Support union of types (VincentLanglet) + * feature #58542 [Validator] Add `Slug` constraint (raffaelecarelle) + * feature #59286 [Serializer] Deprecate the `CompiledClassMetadataFactory` (mtarld) + * feature #59257 [DependencyInjection] Support `@>` as a shorthand for `!service_closure` in YamlFileLoader (chx) + * feature #58545 [String] Add `AbstractString::pascal()` method (raffaelecarelle) + * feature #58559 [Validator] [DateTime] Add `format` to error messages (sauliusnord) + * feature #58564 [HttpKernel] Let Monolog handle the creation of log folder for improved readonly containers handling (shyim) + * feature #59360 [Messenger] Implement `KeepaliveReceiverInterface` in Redis bridge (HypeMC) + * feature #58698 [Mailer] Add AhaSend Bridge (farhadhf) + * feature #57632 [PropertyInfo] Add `PropertyDescriptionExtractorInterface` to `PhpStanExtractor` (mtarld) + * feature #58786 [Notifier] [Brevo][SMS] Brevo sms notifier add options (ikerib) + * feature #59273 [Messenger] Add `BeanstalkdPriorityStamp` to Beanstalkd bridge (HypeMC) + * feature #58761 [Mailer] [Amazon] Add support for custom headers in ses+api (StudioMaX) + * feature #54939 [Mailer] Add `retry_period` option for email transport (Sébastien Despont, fabpot) + * feature #59068 [HttpClient] Add IPv6 support to NativeHttpClient (dmitrii-baranov-tg) + * feature #59088 [DependencyInjection] Make `#[AsTaggedItem]` repeatable (alexandre-daubois) + * feature #59301 [Cache][HttpKernel] Add a `noStore` argument to the `#` attribute (smnandre) + * feature #59315 [Yaml] Add compact nested mapping support to `Dumper` (gr8b) + * feature #59325 [Config] Add `ifFalse()` (OskarStark) + * feature #58243 [Yaml] Add support for dumping `null` as an empty value by using the `Yaml::DUMP_NULL_AS_EMPTY` flag (alexandre-daubois) + * feature #59291 [TypeInfo] Add `accepts` method (mtarld) + * feature #59265 [Validator] Validate SVG ratio in Image validator (maximecolin) + * feature #59129 [SecurityBundle][TwigBridge] Add `is_granted_for_user()` function (natewiebe13) + * feature #59254 [JsonEncoder] Remove chunk size definition (mtarld) + * feature #59022 [HttpFoundation] Generate url-safe hashes for signed urls (valtzu) + * feature #59177 [JsonEncoder] Add native lazyghost support (mtarld) + * feature #59192 [PropertyInfo] Add non-*-int missing types for PhpStanExtractor (wuchen90) + * feature #58515 [FrameworkBundle][JsonEncoder] Wire services (mtarld) + * feature #59157 [HttpKernel] [MapQueryString] added key argument to MapQueryString attribute (feymo) + * feature #59154 [HttpFoundation] Support iterable of string in `StreamedResponse` (mtarld) + * feature #51718 [Serializer] [JsonEncoder] Introducing the component (mtarld) + * feature #58946 [Console] Add support of millisecondes for `formatTime` (SebLevDev) + * feature #48142 [Security][SecurityBundle] User authorization checker (natewiebe13) + * feature #59075 [Uid] Add ``@return` non-empty-string` annotations to `AbstractUid` and relevant functions (niravpateljoin) + * feature #59114 [ErrorHandler] support non-empty-string/non-empty-list when patching return types (xabbuh) + * feature #59020 [AssetMapper] add support for assets pre-compression (dunglas) + * feature #58651 [Mailer][Notifier] Add webhooks signature verification on Sweego bridges (welcoMattic) + * feature #59026 [VarDumper] Add caster for Socket instances (nicolas-grekas) + * feature #58989 [VarDumper] Add caster for `AddressInfo` objects (nicolas-grekas) + diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index ffc3b6feae6fd..3e7f5ec2b6e78 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -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) - 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) @@ -79,8 +79,8 @@ The Symfony Connect username in parenthesis allows to get more information - Iltar van der Berg - Miha Vrhovnik (mvrhov) - Gary PEGEOT (gary-p) - - Saša Stamenković (umpirsky) - Alexander Schranz (alexander-schranz) + - Saša Stamenković (umpirsky) - Allison Guilhem (a_guilhem) - Mathieu Piot (mpiot) - Vasilij Duško (staff) @@ -94,10 +94,10 @@ The Symfony Connect username in parenthesis allows to get more information - Vladimir Reznichenko (kalessil) - Peter Rehm (rpet) - Henrik Bjørnskov (henrikbjorn) - - David Buchmann (dbu) - Ruud Kamphuis (ruudk) - - Andrej Hudec (pulzarraider) + - David Buchmann (dbu) - Tomas Norkūnas (norkunas) + - Andrej Hudec (pulzarraider) - Jáchym Toušek (enumag) - Hubert Lenoir (hubert_lenoir) - Christian Raue @@ -111,14 +111,14 @@ The Symfony Connect username in parenthesis allows to get more information - Frank A. Fiebig (fafiebig) - Baldini - Fran Moreno (franmomu) + - Antoine Makdessi (amakdessi) - Charles Sarrazin (csarrazi) - Henrik Westphal (snc) - Dariusz Górecki (canni) - - Antoine Makdessi (amakdessi) - Ener-Getick - Graham Campbell (graham) - - Massimiliano Arione (garak) - Joel Wurtz (brouznouf) + - Massimiliano Arione (garak) - Tugdual Saunier (tucksaun) - Lee McDermott - Brandon Turner @@ -160,12 +160,13 @@ The Symfony Connect username in parenthesis allows to get more information - Włodzimierz Gajda (gajdaw) - Javier Spagnoletti (phansys) - Adrien Brault (adrienbrault) + - Florent Morselli (spomky_) + - soyuka - Florian Voutzinos (florianv) - Teoh Han Hui (teohhanhui) - Przemysław Bogusz (przemyslaw-bogusz) - Colin Frei - excelwebzone - - Florent Morselli (spomky_) - Paráda József (paradajozsef) - Maximilian Beckers (maxbeckers) - Baptiste Clavié (talus) @@ -178,13 +179,13 @@ The Symfony Connect username in parenthesis allows to get more information - jeremyFreeAgent (jeremyfreeagent) - Michael Babker (mbabker) - Alexis Lefebvre + - Hugo Alliaume (kocal) - Christopher Hertel (chertel) - Joshua Thijssen - Vasilij Dusko - Daniel Wehner (dawehner) - Robert Schönthal (digitalkaoz) - Smaine Milianni (ismail1432) - - Hugo Alliaume (kocal) - François-Xavier de Guillebon (de-gui_f) - Andreas Schempp (aschempp) - noniagriconomie @@ -195,7 +196,6 @@ The Symfony Connect username in parenthesis allows to get more information - Niels Keurentjes (curry684) - OGAWA Katsuhiro (fivestar) - Jhonny Lidfors (jhonne) - - soyuka - Juti Noppornpitak (shiroyuki) - Gregor Harlan (gharlan) - Anthony MARTIN @@ -255,6 +255,7 @@ The Symfony Connect username in parenthesis allows to get more information - Alessandro Lai (jean85) - 77web - Gocha Ossinkine (ossinkine) + - matlec - Jesse Rushlow (geeshoe) - Matthieu Ouellette-Vachon (maoueh) - Michał Pipa (michal.pipa) @@ -277,6 +278,7 @@ The Symfony Connect username in parenthesis allows to get more information - Sébastien Alfaiate (seb33300) - James Halsall (jaitsu) - Christian Scheb + - Alex Hofbauer (alexhofbauer) - Mikael Pajunen - Warnar Boekkooi (boekkooi) - Justin Hileman (bobthecow) @@ -302,11 +304,13 @@ The Symfony Connect username in parenthesis allows to get more information - 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) @@ -327,20 +331,21 @@ The Symfony Connect username in parenthesis allows to get more information - Stadly - Stepan Anchugov (kix) - bronze1man - - matlec - sun (sun) + - Filippo Tessarotto (slamdunk) - Larry Garfield (crell) - Leo Feyer - Nikolay Labinskiy (e-moe) - 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) - Joe Bennett (kralos) @@ -364,11 +369,9 @@ The Symfony Connect username in parenthesis allows to get more information - Arjen van der Meijden - Sven Paulus (subsven) - 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) @@ -376,6 +379,7 @@ The Symfony Connect username in parenthesis allows to get more information - Pascal Montoya - Julien Brochet - François Pluchino (francoispluchino) + - W0rma - Tristan Darricau (tristandsensio) - Jan Sorgalla (jsor) - henrikbjorn @@ -386,7 +390,6 @@ The Symfony Connect username in parenthesis allows to get more information - dFayet - Rob Frawley 2nd (robfrawley) - Renan (renanbr) - - Jonathan H. Wage - Nikita Konstantinov (unkind) - Dariusz - Daniel Gorgan @@ -395,12 +398,12 @@ The Symfony Connect username in parenthesis allows to get more information - Daniel Tschinder - Christian Schmidt - Alexander Kotynia (olden) + - Matthieu Lempereur (mryamous) - Elnur Abdurrakhimov (elnur) - Manuel Reinhard (sprain) - Zan Baldwin (zanbaldwin) - Tim Goudriaan (codedmonkey) - BoShurik - - Quentin Devos - Adam Prager (padam87) - Benoît Burnichon (bburnichon) - maxime.steinhausser @@ -426,7 +429,7 @@ The Symfony Connect username in parenthesis allows to get more information - 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) @@ -436,6 +439,7 @@ The Symfony Connect username in parenthesis allows to get more information - GordonsLondon - Ray - Philipp Cordes (corphi) + - Fabien S (bafs) - Chekote - Thomas Adam - Anderson Müller @@ -461,7 +465,6 @@ 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) @@ -470,6 +473,7 @@ The Symfony Connect username in parenthesis allows to get more information - Marcos Sánchez - Emanuele Panzeri (thepanz) - Zmey + - Santiago San Martin (santysisi) - Kim Hemsø Rasmussen (kimhemsoe) - Maximilian Reichel (phramz) - Samaël Villette (samadu61) @@ -489,14 +493,15 @@ The Symfony Connect username in parenthesis allows to get more information - Bohan Yang (brentybh) - Vilius Grigaliūnas - Jordane VASPARD (elementaire) - - Chris Smith (cs278) - 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) @@ -506,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) @@ -542,6 +546,7 @@ The Symfony Connect username in parenthesis allows to get more information - Ahmed Raafat - Philippe Segatori - Thibaut Cheymol (tcheymol) + - Vincent Chalamon - Raffaele Carelle - Erin Millard - Matthew Lewinski (lewinski) @@ -583,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) @@ -609,7 +615,6 @@ The Symfony Connect username in parenthesis allows to get more information - Alex (aik099) - Kieran Brahney - Fabien Villepinte - - SiD (plbsid) - Greg Thornton (xdissent) - Alex Bowers - Kev @@ -635,7 +640,7 @@ The Symfony Connect username in parenthesis allows to get more information - Ivan Sarastov (isarastov) - flack (flack) - Shein Alexey - - Pierre Ambroise (dotordu) + - Link1515 - Joe Lencioni - Daniel Tschinder - Diego Agulló (aeoris) @@ -658,6 +663,7 @@ 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) @@ -697,7 +703,6 @@ The Symfony Connect username in parenthesis allows to get more information - Neil Peyssard (nepey) - Niklas Fiekas - Mark Challoner (markchalloner) - - Vincent Chalamon - Andreas Hennings - Markus Bachmann (baachi) - Gunnstein Lye (glye) @@ -713,6 +718,7 @@ The Symfony Connect username in parenthesis allows to get more information - 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) @@ -755,6 +761,7 @@ The Symfony Connect username in parenthesis allows to get more information - Jérémy REYNAUD (babeuloula) - Faizan Akram Dar (faizanakram) - Arkadius Stefanski (arkadius) + - Andy Palmer (andyexeter) - Jonas Flodén (flojon) - AnneKir - Tobias Weichart @@ -762,7 +769,6 @@ The Symfony Connect username in parenthesis allows to get more information - Tristan Pouliquen - Miro Michalicka - Hans Mackowiak - - Dalibor Karlović - M. Vondano - Dominik Zogg - Maximilian Zumbansen @@ -779,6 +785,7 @@ The Symfony Connect username in parenthesis allows to get more information - Giso Stallenberg (gisostallenberg) - Rob Bast - Roberto Espinoza (respinoza) + - Steven RENAUX (steven_renaux) - Marvin Feldmann (breyndotechse) - Soufian EZ ZANTAR (soezz) - Marek Zajac @@ -865,7 +872,6 @@ The Symfony Connect username in parenthesis allows to get more information - Dariusz Ruminski - Bahman Mehrdad (bahman) - Romain Gautier (mykiwi) - - Link1515 - Matthieu Bontemps - Erik Trapman - De Cock Xavier (xdecock) @@ -936,7 +942,6 @@ The Symfony Connect username in parenthesis allows to get more information - Forfarle (forfarle) - Johnny Robeson (johnny) - Disquedur - - Benjamin Morel - Guilherme Ferreira - Geoffrey Tran (geoff) - Jannik Zschiesche @@ -1003,12 +1008,12 @@ The Symfony Connect username in parenthesis allows to get more information - Alexandre Dupuy (satchette) - Michel Hunziker - Malte Blättermann + - Ilya Levin (ilyachase) - Simeon Kolev (simeon_kolev9) - Joost van Driel (j92) - Jonas Elfering - Mihai Stancu - Nahuel Cuesta (ncuesta) - - Santiago San Martin - Chris Boden (cboden) - EStyles (insidestyles) - Christophe Villeger (seragan) @@ -1063,7 +1068,6 @@ 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) - Tristan Maindron (tmaindron) @@ -1101,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) @@ -1112,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 @@ -1491,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 @@ -1507,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 @@ -1672,13 +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) @@ -1707,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) @@ -1860,6 +1867,7 @@ 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) @@ -1953,7 +1961,6 @@ The Symfony Connect username in parenthesis allows to get more information - Bruno MATEU - Jeremy Bush - Lucas Bäuerle - - Steven RENAUX (steven_renaux) - Laurens Laman - Thomason, James - Dario Savella @@ -1964,6 +1971,7 @@ The Symfony Connect username in parenthesis allows to get more information - Peter Trebaticky - Moza Bogdan (bogdan_moza) - Viacheslav Sychov + - Zuruuh - Nicolas Sauveur (baishu) - Helmut Hummel (helhum) - Matt Brunt @@ -2015,6 +2023,7 @@ The Symfony Connect username in parenthesis allows to get more information - Rémi Leclerc - Jan Vernarsky - Ionut Cioflan + - John Edmerson Pizarra - Sergio - Jonas Hünig - Mehrdad @@ -2188,6 +2197,7 @@ 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) @@ -2257,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) @@ -2271,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 @@ -2289,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 @@ -2367,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) @@ -2572,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 @@ -2701,6 +2716,7 @@ The Symfony Connect username in parenthesis allows to get more information - Marcel Siegert - ryunosuke - Bruno BOUTAREL + - Athorcis - John Stevenson - everyx - Richard Heine @@ -2758,6 +2774,7 @@ 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) @@ -2866,7 +2883,6 @@ The Symfony Connect username in parenthesis allows to get more information - fabi - Grayson Koonce - Ruben Jansen - - nathanpage - Wissame MEKHILEF - Mihai Stancu - shreypuranik @@ -3106,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 @@ -3143,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) @@ -3161,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 @@ -3197,7 +3216,6 @@ The Symfony Connect username in parenthesis allows to get more information - Buster Neece - Albert Prat - Alessandro Loffredo - - Tim Düsterhus - Ian Phillips - Carlos Tasada - Remi Collet @@ -3319,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) @@ -3357,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 @@ -3392,6 +3413,7 @@ The Symfony Connect username in parenthesis allows to get more information - Evgeniy Koval - Lars Moelleken - dasmfm + - Karel Syrový - Claas Augner - Mathias Geat - neodevcode @@ -3445,6 +3467,7 @@ The Symfony Connect username in parenthesis allows to get more information - Sylvain Lorinet - Pavol Tuka - klyk50 + - Colin Michoudet - jc - BenjaminBeck - Aurelijus Rožėnas @@ -3474,6 +3497,7 @@ The Symfony Connect username in parenthesis allows to get more information - Philipp - lol768 - jamogon + - Tom Hart - Vyacheslav Slinko - Benjamin Laugueux - guangwu @@ -3571,6 +3595,7 @@ The Symfony Connect username in parenthesis allows to get more information - mieszko4 - Steve Preston - ibasaw + - koyolgecen - Wojciech Skorodecki - Kevin Frantz - Neophy7e @@ -3580,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 @@ -3601,6 +3625,7 @@ The Symfony Connect username in parenthesis allows to get more information - satalaondrej - Matthias Dötsch - jonmldr + - Nowfel2501 - Yevgen Kovalienia - Lebnik - Shude @@ -3622,6 +3647,7 @@ The Symfony Connect username in parenthesis allows to get more information - Egor Gorbachev - Julian Krzefski - Derek Stephen McLean + - PatrickRedStar - Norman Soetbeer - zorn - Yuriy Potemkin @@ -3731,6 +3757,7 @@ The Symfony Connect username in parenthesis allows to get more information - Brandon Kelly (brandonkelly) - Choong Wei Tjeng (choonge) - Bermon Clément (chou666) + - Chris Shennan (chrisshennan) - Citia (citia) - Kousuke Ebihara (co3k) - Loïc Vernet (coil) @@ -3893,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) diff --git a/UPGRADE-7.3.md b/UPGRADE-7.3.md index 5652ce639f19d..5fa4d18677279 100644 --- a/UPGRADE-7.3.md +++ b/UPGRADE-7.3.md @@ -8,6 +8,37 @@ Read more about this in the [Symfony documentation](https://symfony.com/doc/7.3/ If you're upgrading from a version below 7.2, follow the [7.2 upgrade guide](UPGRADE-7.2.md) first. +Table of Contents +----------------- + +Bundles + + * [FrameworkBundle](#FrameworkBundle) + * [SecurityBundle](#SecurityBundle) + * [WebProfilerBundle](#WebProfilerBundle) + +Bridges + + * [DoctrineBridge](#DoctrineBridge) + +Components + + * [AssetMapper](#AssetMapper) + * [Console](#Console) + * [DependencyInjection](#DependencyInjection) + * [HttpFoundation](#HttpFoundation) + * [Ldap](#Ldap) + * [OptionsResolver](#OptionsResolver) + * [PropertyInfo](#PropertyInfo) + * [Security](#Security) + * [Notifier](#Notifier) + * [Serializer](#Serializer) + * [TypeInfo](#TypeInfo) + * [Validator](#Validator) + * [VarDumper](#VarDumper) + * [VarExporter](#VarExporter) + * [Workflow](#Workflow) + AssetMapper ----------- @@ -59,6 +90,7 @@ FrameworkBundle because its default value will change in version 8.0 * Deprecate the `--show-arguments` option of the `container:debug` command, as arguments are now always shown * Deprecate the `framework.validation.cache` config option + * Deprecate the `RateLimiterFactory` autowiring aliases, use `RateLimiterFactoryInterface` instead * Deprecate setting the `framework.profiler.collect_serializer_data` config option to `false` When set to `true`, normalizers must be injected using the `NormalizerInterface`, and not using any concrete implementation. @@ -75,6 +107,40 @@ FrameworkBundle public function __construct(#[Autowire('@serializer.normalizer.object')] NormalizerInterface $normalizer) {} ``` + * The XML routing configuration files (`errors.xml` and `webhook.xml`) are + deprecated, use their PHP equivalent ones: + + Before: + + ```yaml + when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + prefix: /_error + + webhook: + resource: '@FrameworkBundle/Resources/config/routing/webhook.xml' + prefix: /webhook + ``` + + After: + + ```yaml + when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.php' + prefix: /_error + + webhook: + resource: '@FrameworkBundle/Resources/config/routing/webhook.php' + prefix: /webhook + ``` + +HttpFoundation +-------------- + + * `Request::getPreferredLanguage()` now favors a more preferred language above exactly matching a locale + Ldap ---- @@ -144,9 +210,7 @@ Security ```php protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token, ?Vote $vote = null): bool { - $vote ??= new Vote(); - - $vote->reasons[] = 'A brief explanation of why access is granted or denied, as appropriate.'; + $vote?->addReason('A brief explanation of why access is granted or denied, as appropriate.'); } ``` @@ -160,8 +224,8 @@ SecurityBundle * Deprecate the `security.hide_user_not_found` config option in favor of `security.expose_security_errors` - Notifier - -------- +Notifier +-------- * Deprecate the `Sms77` transport, use `SevenIo` instead @@ -170,6 +234,12 @@ Serializer * Deprecate the `CompiledClassMetadataFactory` and `CompiledClassMetadataCacheWarmer` classes +TypeInfo +-------- + + * Deprecate constructing a `CollectionType` instance as a list that is not an array + * Deprecate the third `$asList` argument of `TypeFactoryTrait::iterable()`, use `TypeFactoryTrait::list()` instead + Validator --------- @@ -225,12 +295,6 @@ Validator ) ``` -TypeInfo --------- - - * Deprecate constructing a `CollectionType` instance as a list that is not an array - * Deprecate the third `$asList` argument of `TypeFactoryTrait::iterable()`, use `TypeFactoryTrait::list()` instead - VarDumper --------- @@ -243,3 +307,110 @@ VarExporter * Deprecate using `ProxyHelper::generateLazyProxy()` when native lazy proxies can be used - the method should be used to generate abstraction-based lazy decorators only * Deprecate `LazyGhostTrait` and `LazyProxyTrait`, use native lazy objects instead * Deprecate `ProxyHelper::generateLazyGhost()`, use native lazy objects instead + +WebProfilerBundle +----------------- + + * The XML routing configuration files (`profiler.xml` and `wdt.xml`) are + deprecated, use their PHP equivalent ones: + + Before: + + ```yaml + when@dev: + web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + + web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler + ``` + + After: + + ```yaml + when@dev: + web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.php' + prefix: /_wdt + + web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.php + prefix: /_profiler + ``` + +Workflow +-------- + + * Deprecate `Event::getWorkflow()` method + + Before: + + ```php + use Symfony\Component\Workflow\Attribute\AsCompletedListener; + use Symfony\Component\Workflow\Event\CompletedEvent; + + class MyListener + { + #[AsCompletedListener('my_workflow', 'to_state2')] + public function terminateOrder(CompletedEvent $event): void + { + $subject = $event->getSubject(); + if ($event->getWorkflow()->can($subject, 'to_state3')) { + $event->getWorkflow()->apply($subject, 'to_state3'); + } + } + } + ``` + + After: + + ```php + use Symfony\Component\DependencyInjection\Attribute\Target; + use Symfony\Component\Workflow\Attribute\AsCompletedListener; + use Symfony\Component\Workflow\Event\CompletedEvent; + use Symfony\Component\Workflow\WorkflowInterface; + + class MyListener + { + public function __construct( + #[Target('your_workflow_name')] + private readonly WorkflowInterface $workflow, + ) { + } + + #[AsCompletedListener('your_workflow_name', 'to_state2')] + public function terminateOrder(CompletedEvent $event): void + { + $subject = $event->getSubject(); + if ($this->workflow->can($subject, 'to_state3')) { + $this->workflow->apply($subject, 'to_state3'); + } + } + } + ``` + + Or: + + ```php + use Symfony\Component\DependencyInjection\ServiceLocator; + use Symfony\Component\DependencyInjection\Attribute\AutowireLocator; + use Symfony\Component\Workflow\Attribute\AsTransitionListener; + use Symfony\Component\Workflow\Event\TransitionEvent; + + class GenericListener + { + public function __construct( + #[AutowireLocator('workflow', 'name')] + private ServiceLocator $workflows + ) { + } + + #[AsTransitionListener()] + public function doSomething(TransitionEvent $event): void + { + $workflow = $this->workflows->get($event->getWorkflowName()); + } + } + ``` diff --git a/composer.json b/composer.json index 3cfbe70ae68d8..20bcb49c4b782 100644 --- a/composer.json +++ b/composer.json @@ -143,7 +143,7 @@ "league/uri": "^6.5|^7.0", "masterminds/html5": "^2.7.2", "monolog/monolog": "^3.0", - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "nyholm/psr7": "^1.0", "pda/pheanstalk": "^5.1|^7.0", "php-http/discovery": "^1.15", diff --git a/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php b/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php index ffff3006f7184..1efa7d78d0524 100644 --- a/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php +++ b/src/Symfony/Bridge/Doctrine/ArgumentResolver/EntityValueResolver.php @@ -21,6 +21,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +use Symfony\Component\HttpKernel\Exception\NearMissValueResolverException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** @@ -68,7 +69,11 @@ public function resolve(Request $request, ArgumentMetadata $argument): array } elseif (false === $object = $this->find($manager, $request, $options, $argument)) { // find by criteria if (!$criteria = $this->getCriteria($request, $options, $manager, $argument)) { - return []; + if (!class_exists(NearMissValueResolverException::class)) { + return []; + } + + throw new NearMissValueResolverException(sprintf('Cannot find mapping for "%s": declare one using either the #[MapEntity] attribute or mapped route parameters.', $options->class)); } try { $object = $manager->getRepository($options->class)->findOneBy($criteria); @@ -185,7 +190,7 @@ private function getCriteria(Request $request, MapEntity $options, ObjectManager return $criteria; } elseif (null === $mapping) { - trigger_deprecation('symfony/doctrine-bridge', '7.1', 'Relying on auto-mapping for Doctrine entities is deprecated for argument $%s of "%s": declare the identifier using either the #[MapEntity] attribute or mapped route parameters.', $argument->getName(), method_exists($argument, 'getControllerName') ? $argument->getControllerName() : 'n/a'); + trigger_deprecation('symfony/doctrine-bridge', '7.1', 'Relying on auto-mapping for Doctrine entities is deprecated for argument $%s of "%s": declare the mapping using either the #[MapEntity] attribute or mapped route parameters.', $argument->getName(), method_exists($argument, 'getControllerName') ? $argument->getControllerName() : 'n/a'); $mapping = $request->attributes->keys(); } diff --git a/src/Symfony/Bridge/Doctrine/CHANGELOG.md b/src/Symfony/Bridge/Doctrine/CHANGELOG.md index fbd1055437d8f..961a0965d3431 100644 --- a/src/Symfony/Bridge/Doctrine/CHANGELOG.md +++ b/src/Symfony/Bridge/Doctrine/CHANGELOG.md @@ -7,12 +7,13 @@ CHANGELOG * Reset the manager registry using native lazy objects when applicable * Deprecate the `DoctrineExtractor::getTypes()` method, use `DoctrineExtractor::getType()` instead * Add support for `Symfony\Component\Clock\DatePoint` as `DatePointType` Doctrine type + * Improve exception message when `EntityValueResolver` gets no mapping information + * Add type aliases support to `EntityValueResolver` 7.2 --- * Accept `ReadableCollection` in `CollectionToArrayTransformer` - * Add type aliases support to `EntityValueResolver` 7.1 --- diff --git a/src/Symfony/Bridge/Doctrine/ManagerRegistry.php b/src/Symfony/Bridge/Doctrine/ManagerRegistry.php index a533b3bb8d12c..fa4d88b99455d 100644 --- a/src/Symfony/Bridge/Doctrine/ManagerRegistry.php +++ b/src/Symfony/Bridge/Doctrine/ManagerRegistry.php @@ -80,21 +80,35 @@ function (&$wrappedInstance, LazyLoadingInterface $manager) use ($name) { return; } - try { - $r->resetAsLazyProxy($manager, \Closure::bind( - function () use ($name) { - $name = $this->aliases[$name] ?? $name; + $asProxy = $r->initializeLazyObject($manager) !== $manager; + $initializer = \Closure::bind( + function ($manager) use ($name, $asProxy) { + $name = $this->aliases[$name] ?? $name; + if ($asProxy) { + $manager = false; + } + + $manager = match (true) { + isset($this->fileMap[$name]) => $this->load($this->fileMap[$name], $manager), + !$method = $this->methodMap[$name] ?? null => throw new \LogicException(\sprintf('The "%s" service is synthetic and cannot be reset.', $name)), + (new \ReflectionMethod($this, $method))->isStatic() => $this->{$method}($this, $manager), + default => $this->{$method}($manager), + }; + + if ($asProxy) { + return $manager; + } + }, + $this->container, + Container::class + ); - return match (true) { - isset($this->fileMap[$name]) => $this->load($this->fileMap[$name], false), - !$method = $this->methodMap[$name] ?? null => throw new \LogicException(\sprintf('The "%s" service is synthetic and cannot be reset.', $name)), - (new \ReflectionMethod($this, $method))->isStatic() => $this->{$method}($this, false), - default => $this->{$method}(false), - }; - }, - $this->container, - Container::class - )); + try { + if ($asProxy) { + $r->resetAsLazyProxy($manager, $initializer); + } else { + $r->resetAsLazyGhost($manager, $initializer); + } } catch (\Error $e) { if (__FILE__ !== $e->getFile()) { throw $e; diff --git a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php index 91ec5e89b99d3..8207317803857 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php @@ -24,6 +24,7 @@ use Symfony\Component\ExpressionLanguage\SyntaxError; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +use Symfony\Component\HttpKernel\Exception\NearMissValueResolverException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class EntityValueResolverTest extends TestCase @@ -75,6 +76,11 @@ public function testResolveWithNoIdAndDataOptional() $request = new Request(); $argument = $this->createArgument(null, new MapEntity(), 'arg', true); + if (class_exists(NearMissValueResolverException::class)) { + $this->expectException(NearMissValueResolverException::class); + $this->expectExceptionMessage('Cannot find mapping for "stdClass": declare one using either the #[MapEntity] attribute or mapped route parameters.'); + } + $this->assertSame([], $resolver->resolve($request, $argument)); } @@ -94,6 +100,11 @@ public function testResolveWithStripNulls() $manager->expects($this->never()) ->method('getRepository'); + if (class_exists(NearMissValueResolverException::class)) { + $this->expectException(NearMissValueResolverException::class); + $this->expectExceptionMessage('Cannot find mapping for "stdClass": declare one using either the #[MapEntity] attribute or mapped route parameters.'); + } + $this->assertSame([], $resolver->resolve($request, $argument)); } @@ -262,6 +273,11 @@ public function testResolveGuessOptional() $manager->expects($this->never())->method('getRepository'); + if (class_exists(NearMissValueResolverException::class)) { + $this->expectException(NearMissValueResolverException::class); + $this->expectExceptionMessage('Cannot find mapping for "stdClass": declare one using either the #[MapEntity] attribute or mapped route parameters.'); + } + $this->assertSame([], $resolver->resolve($request, $argument)); } diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DummyManager.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DummyManager.php index 04e5a2acdd334..806ef032d8d5c 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DummyManager.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DummyManager.php @@ -1,5 +1,14 @@ + * + * 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\Persistence\Mapping\ClassMetadata; @@ -11,6 +20,10 @@ class DummyManager implements ObjectManager { public $bar; + public function __construct() + { + } + public function find($className, $id): ?object { } 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/ManagerRegistryTest.php b/src/Symfony/Bridge/Doctrine/Tests/ManagerRegistryTest.php index fa44ba0a00bbb..4803e6acaf0af 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/ManagerRegistryTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/ManagerRegistryTest.php @@ -22,7 +22,7 @@ class ManagerRegistryTest extends TestCase { - public static function setUpBeforeClass(): void + public function testResetService() { $container = new ContainerBuilder(); @@ -32,10 +32,7 @@ public static function setUpBeforeClass(): void $dumper = new PhpDumper($container); eval('?>'.$dumper->dump(['class' => 'LazyServiceDoctrineBridgeContainer'])); - } - public function testResetService() - { $container = new \LazyServiceDoctrineBridgeContainer(); $registry = new TestManagerRegistry('name', [], ['defaultManager' => 'foo'], 'defaultConnection', 'defaultManager', 'proxyInterfaceName'); @@ -52,6 +49,63 @@ public function testResetService() $this->assertFalse(isset($foo->bar)); } + /** + * @requires PHP 8.4 + * + * @dataProvider provideResetServiceWithNativeLazyObjectsCases + */ + public function testResetServiceWithNativeLazyObjects(string $class) + { + $container = new $class(); + + $registry = new TestManagerRegistry( + 'irrelevant', + [], + ['defaultManager' => 'foo'], + 'irrelevant', + 'defaultManager', + 'irrelevant', + ); + $registry->setTestContainer($container); + + $foo = $container->get('foo'); + self::assertSame(DummyManager::class, $foo::class); + + $foo->bar = 123; + self::assertTrue(isset($foo->bar)); + + $registry->resetManager(); + + self::assertSame($foo, $container->get('foo')); + self::assertSame(DummyManager::class, $foo::class); + self::assertFalse(isset($foo->bar)); + } + + public static function provideResetServiceWithNativeLazyObjectsCases(): iterable + { + $container = new ContainerBuilder(); + + $container->register('foo', DummyManager::class)->setPublic(true); + $container->getDefinition('foo')->setLazy(true); + $container->compile(); + + $dumper = new PhpDumper($container); + + eval('?>'.$dumper->dump(['class' => 'NativeLazyServiceDoctrineBridgeContainer'])); + + yield ['NativeLazyServiceDoctrineBridgeContainer']; + + $dumps = $dumper->dump(['class' => 'NativeLazyServiceDoctrineBridgeContainerAsFiles', 'as_files' => true]); + + $lastDump = array_pop($dumps); + foreach (array_reverse($dumps) as $dump) { + eval('?>'.$dump); + } + eval('?>'.$lastDump); + + yield ['NativeLazyServiceDoctrineBridgeContainerAsFiles']; + } + /** * When performing an entity manager lazy service reset, the reset operations may re-use the container * to create a "fresh" service: when doing so, it can happen that the "fresh" service is itself a proxy. diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php index ad3d603adbfaf..04817d9389049 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php @@ -30,7 +30,7 @@ use Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineWithEmbedded; use Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\EnumInt; use Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\EnumString; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\PropertyInfo\Type as LegacyType; use Symfony\Component\TypeInfo\Type; @@ -39,7 +39,7 @@ */ class DoctrineExtractorTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; private function createExtractor(): DoctrineExtractor { @@ -117,7 +117,7 @@ public function testTestGetPropertiesWithEmbedded() */ public function testExtractLegacy(string $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); $this->assertEquals($type, $this->createExtractor()->getTypes(DoctrineDummy::class, $property, [])); } @@ -127,7 +127,7 @@ public function testExtractLegacy(string $property, ?array $type = null) */ public function testExtractWithEmbeddedLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); $expectedTypes = [new LegacyType( LegacyType::BUILTIN_TYPE_OBJECT, @@ -149,7 +149,7 @@ public function testExtractWithEmbeddedLegacy() */ public function testExtractEnumLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); $this->assertEquals([new LegacyType(LegacyType::BUILTIN_TYPE_OBJECT, false, EnumString::class)], $this->createExtractor()->getTypes(DoctrineEnum::class, 'enumString', [])); $this->assertEquals([new LegacyType(LegacyType::BUILTIN_TYPE_OBJECT, false, EnumInt::class)], $this->createExtractor()->getTypes(DoctrineEnum::class, 'enumInt', [])); @@ -265,7 +265,7 @@ public function testGetPropertiesCatchException() */ public function testGetTypesCatchExceptionLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getTypes()" method is deprecated, use "Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor::getType()" instead.'); $this->assertNull($this->createExtractor()->getTypes('Not\Exist', 'baz')); } 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/Types/DatePointTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Types/DatePointTypeTest.php index a5aaec292b906..84b265ed6502c 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Types/DatePointTypeTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Types/DatePointTypeTest.php @@ -11,11 +11,9 @@ namespace Symfony\Bridge\Doctrine\Tests\Types; +use Doctrine\DBAL\Exception; use Doctrine\DBAL\Platforms\AbstractPlatform; -use Doctrine\DBAL\Platforms\MariaDBPlatform; use Doctrine\DBAL\Platforms\PostgreSQLPlatform; -use Doctrine\DBAL\Platforms\SqlitePlatform; -use Doctrine\DBAL\Types\ConversionException; use Doctrine\DBAL\Types\Type; use PHPUnit\Framework\TestCase; use Symfony\Bridge\Doctrine\Types\DatePointType; @@ -56,14 +54,14 @@ public function testDatePointConvertsToDatabaseValue() public function testDatePointConvertsToPHPValue() { $datePoint = new DatePoint(); - $actual = $this->type->convertToPHPValue($datePoint, new SqlitePlatform()); + $actual = $this->type->convertToPHPValue($datePoint, self::getSqlitePlatform()); $this->assertSame($datePoint, $actual); } public function testNullConvertsToPHPValue() { - $actual = $this->type->convertToPHPValue(null, new SqlitePlatform()); + $actual = $this->type->convertToPHPValue(null, self::getSqlitePlatform()); $this->assertNull($actual); } @@ -72,14 +70,32 @@ public function testDateTimeImmutableConvertsToPHPValue() { $format = 'Y-m-d H:i:s'; $dateTime = new \DateTimeImmutable('2025-03-03 12:13:14'); - $actual = $this->type->convertToPHPValue($dateTime, new SqlitePlatform()); + $actual = $this->type->convertToPHPValue($dateTime, self::getSqlitePlatform()); $expected = DatePoint::createFromInterface($dateTime); $this->assertSame($expected->format($format), $actual->format($format)); } + public function testDatabaseValueConvertsToPHPValue() + { + $actual = $this->type->convertToPHPValue('2025-03-03 12:13:14', new PostgreSQLPlatform()); + + $this->assertInstanceOf(DatePoint::class, $actual); + $this->assertSame('2025-03-03 12:13:14', $actual->format('Y-m-d H:i:s')); + } + public function testGetName() { $this->assertSame('date_point', $this->type->getName()); } + + private static function getSqlitePlatform(): AbstractPlatform + { + if (interface_exists(Exception::class)) { + // DBAL 4+ + return new \Doctrine\DBAL\Platforms\SQLitePlatform(); + } + + return new \Doctrine\DBAL\Platforms\SqlitePlatform(); + } } diff --git a/src/Symfony/Bridge/Doctrine/Tests/Types/UlidTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Types/UlidTypeTest.php index 15852c8a92b64..b490d94f4263f 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Types/UlidTypeTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Types/UlidTypeTest.php @@ -11,11 +11,11 @@ namespace Symfony\Bridge\Doctrine\Tests\Types; +use Doctrine\DBAL\Exception; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Platforms\MariaDBPlatform; use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Platforms\PostgreSQLPlatform; -use Doctrine\DBAL\Platforms\SQLitePlatform; use Doctrine\DBAL\Types\ConversionException; use Doctrine\DBAL\Types\Type; use PHPUnit\Framework\TestCase; @@ -23,12 +23,6 @@ use Symfony\Component\Uid\AbstractUid; use Symfony\Component\Uid\Ulid; -// DBAL 3 compatibility -class_exists('Doctrine\DBAL\Platforms\SqlitePlatform'); - -// DBAL 3 compatibility -class_exists('Doctrine\DBAL\Platforms\SqlitePlatform'); - final class UlidTypeTest extends TestCase { private const DUMMY_ULID = '01EEDQEK6ZAZE93J8KG5B4MBJC'; @@ -87,25 +81,25 @@ public function testNotSupportedTypeConversionForDatabaseValue() { $this->expectException(ConversionException::class); - $this->type->convertToDatabaseValue(new \stdClass(), new SQLitePlatform()); + $this->type->convertToDatabaseValue(new \stdClass(), self::getSqlitePlatform()); } public function testNullConversionForDatabaseValue() { - $this->assertNull($this->type->convertToDatabaseValue(null, new SQLitePlatform())); + $this->assertNull($this->type->convertToDatabaseValue(null, self::getSqlitePlatform())); } public function testUlidInterfaceConvertsToPHPValue() { $ulid = $this->createMock(AbstractUid::class); - $actual = $this->type->convertToPHPValue($ulid, new SQLitePlatform()); + $actual = $this->type->convertToPHPValue($ulid, self::getSqlitePlatform()); $this->assertSame($ulid, $actual); } public function testUlidConvertsToPHPValue() { - $ulid = $this->type->convertToPHPValue(self::DUMMY_ULID, new SQLitePlatform()); + $ulid = $this->type->convertToPHPValue(self::DUMMY_ULID, self::getSqlitePlatform()); $this->assertInstanceOf(Ulid::class, $ulid); $this->assertEquals(self::DUMMY_ULID, $ulid->__toString()); @@ -115,19 +109,19 @@ public function testInvalidUlidConversionForPHPValue() { $this->expectException(ConversionException::class); - $this->type->convertToPHPValue('abcdefg', new SQLitePlatform()); + $this->type->convertToPHPValue('abcdefg', self::getSqlitePlatform()); } public function testNullConversionForPHPValue() { - $this->assertNull($this->type->convertToPHPValue(null, new SQLitePlatform())); + $this->assertNull($this->type->convertToPHPValue(null, self::getSqlitePlatform())); } public function testReturnValueIfUlidForPHPValue() { $ulid = new Ulid(); - $this->assertSame($ulid, $this->type->convertToPHPValue($ulid, new SQLitePlatform())); + $this->assertSame($ulid, $this->type->convertToPHPValue($ulid, self::getSqlitePlatform())); } public function testGetName() @@ -146,13 +140,23 @@ public function testGetGuidTypeDeclarationSQL(AbstractPlatform $platform, string public static function provideSqlDeclarations(): \Generator { yield [new PostgreSQLPlatform(), 'UUID']; - yield [new SQLitePlatform(), 'BLOB']; + yield [self::getSqlitePlatform(), 'BLOB']; yield [new MySQLPlatform(), 'BINARY(16)']; yield [new MariaDBPlatform(), 'BINARY(16)']; } public function testRequiresSQLCommentHint() { - $this->assertTrue($this->type->requiresSQLCommentHint(new SQLitePlatform())); + $this->assertTrue($this->type->requiresSQLCommentHint(self::getSqlitePlatform())); + } + + private static function getSqlitePlatform(): AbstractPlatform + { + if (interface_exists(Exception::class)) { + // DBAL 4+ + return new \Doctrine\DBAL\Platforms\SQLitePlatform(); + } + + return new \Doctrine\DBAL\Platforms\SqlitePlatform(); } } diff --git a/src/Symfony/Bridge/Doctrine/Tests/Types/UuidTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Types/UuidTypeTest.php index 8e4ab2937d05b..f26e43ffe66b3 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Types/UuidTypeTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Types/UuidTypeTest.php @@ -11,11 +11,11 @@ namespace Symfony\Bridge\Doctrine\Tests\Types; +use Doctrine\DBAL\Exception; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Platforms\MariaDBPlatform; use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Platforms\PostgreSQLPlatform; -use Doctrine\DBAL\Platforms\SqlitePlatform; use Doctrine\DBAL\Types\ConversionException; use Doctrine\DBAL\Types\Type; use PHPUnit\Framework\TestCase; @@ -92,25 +92,25 @@ public function testNotSupportedTypeConversionForDatabaseValue() { $this->expectException(ConversionException::class); - $this->type->convertToDatabaseValue(new \stdClass(), new SqlitePlatform()); + $this->type->convertToDatabaseValue(new \stdClass(), self::getSqlitePlatform()); } public function testNullConversionForDatabaseValue() { - $this->assertNull($this->type->convertToDatabaseValue(null, new SqlitePlatform())); + $this->assertNull($this->type->convertToDatabaseValue(null, self::getSqlitePlatform())); } public function testUuidInterfaceConvertsToPHPValue() { $uuid = $this->createMock(AbstractUid::class); - $actual = $this->type->convertToPHPValue($uuid, new SqlitePlatform()); + $actual = $this->type->convertToPHPValue($uuid, self::getSqlitePlatform()); $this->assertSame($uuid, $actual); } public function testUuidConvertsToPHPValue() { - $uuid = $this->type->convertToPHPValue(self::DUMMY_UUID, new SqlitePlatform()); + $uuid = $this->type->convertToPHPValue(self::DUMMY_UUID, self::getSqlitePlatform()); $this->assertInstanceOf(Uuid::class, $uuid); $this->assertEquals(self::DUMMY_UUID, $uuid->__toString()); @@ -120,19 +120,19 @@ public function testInvalidUuidConversionForPHPValue() { $this->expectException(ConversionException::class); - $this->type->convertToPHPValue('abcdefg', new SqlitePlatform()); + $this->type->convertToPHPValue('abcdefg', self::getSqlitePlatform()); } public function testNullConversionForPHPValue() { - $this->assertNull($this->type->convertToPHPValue(null, new SqlitePlatform())); + $this->assertNull($this->type->convertToPHPValue(null, self::getSqlitePlatform())); } public function testReturnValueIfUuidForPHPValue() { $uuid = Uuid::v4(); - $this->assertSame($uuid, $this->type->convertToPHPValue($uuid, new SqlitePlatform())); + $this->assertSame($uuid, $this->type->convertToPHPValue($uuid, self::getSqlitePlatform())); } public function testGetName() @@ -151,13 +151,23 @@ public function testGetGuidTypeDeclarationSQL(AbstractPlatform $platform, string public static function provideSqlDeclarations(): \Generator { yield [new PostgreSQLPlatform(), 'UUID']; - yield [new SqlitePlatform(), 'BLOB']; + yield [self::getSqlitePlatform(), 'BLOB']; yield [new MySQLPlatform(), 'BINARY(16)']; yield [new MariaDBPlatform(), 'BINARY(16)']; } public function testRequiresSQLCommentHint() { - $this->assertTrue($this->type->requiresSQLCommentHint(new SqlitePlatform())); + $this->assertTrue($this->type->requiresSQLCommentHint(self::getSqlitePlatform())); + } + + private static function getSqlitePlatform(): AbstractPlatform + { + if (interface_exists(Exception::class)) { + // DBAL 4+ + return new \Doctrine\DBAL\Platforms\SQLitePlatform(); + } + + return new \Doctrine\DBAL\Platforms\SqlitePlatform(); } } diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index 77aed59874e38..4f93768cddf7c 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -14,7 +14,6 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\DBAL\Types\Type; use Doctrine\ORM\EntityRepository; -use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Tools\SchemaTool; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ObjectManager; @@ -32,7 +31,6 @@ use Symfony\Bridge\Doctrine\Tests\Fixtures\Employee; use Symfony\Bridge\Doctrine\Tests\Fixtures\HireAnEmployee; use Symfony\Bridge\Doctrine\Tests\Fixtures\Person; -use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntityRepository; use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity; use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdNoToStringEntity; use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdStringWrapperNameEntity; @@ -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; @@ -118,6 +119,7 @@ private function createSchema($em) $em->getClassMetadata(Employee::class), $em->getClassMetadata(CompositeObjectNoToStringIdEntity::class), $em->getClassMetadata(SingleIntIdStringWrapperNameEntity::class), + $em->getClassMetadata(UserUuidNameEntity::class), ]); } @@ -1425,4 +1427,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 87eebbca142c6..4aed1cd3a44c2 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -197,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; diff --git a/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php deleted file mode 100644 index 1de94db292656..0000000000000 --- a/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php +++ /dev/null @@ -1,51 +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\Attribute\TimeSensitive; -use Symfony\Bridge\PhpUnit\ClockMock; -use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; - -/** - * @internal - */ -class DisableClockMockSubscriber implements FinishedSubscriber -{ - public function __construct( - private AttributeReader $reader, - ) { - } - - 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); - break; - } - } - - if ($this->reader->forClassAndMethod($test->className(), $test->methodName(), TimeSensitive::class)) { - 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 29cdbbf1835cf..0000000000000 --- a/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php +++ /dev/null @@ -1,51 +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\Attribute\DnsSensitive; -use Symfony\Bridge\PhpUnit\DnsMock; -use Symfony\Bridge\PhpUnit\Metadata\AttributeReader; - -/** - * @internal - */ -class DisableDnsMockSubscriber implements FinishedSubscriber -{ - public function __construct( - private AttributeReader $reader, - ) { - } - - 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([]); - break; - } - } - - if ($this->reader->forClassAndMethod($test->className(), $test->methodName(), DnsSensitive::class)) { - DnsMock::withMockedHosts([]); - } - } -} diff --git a/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php b/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php index a21e4626368b9..05ff99aa8aedc 100644 --- a/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php +++ b/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php @@ -11,12 +11,23 @@ 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\Attribute\DnsSensitive; +use Symfony\Bridge\PhpUnit\Attribute\TimeSensitive; use Symfony\Bridge\PhpUnit\Extension\EnableClockMockSubscriber; use Symfony\Bridge\PhpUnit\Extension\RegisterClockMockSubscriber; use Symfony\Bridge\PhpUnit\Extension\RegisterDnsMockSubscriber; @@ -41,7 +52,58 @@ public function bootstrap(Configuration $configuration, Facade $facade, Paramete $facade->registerSubscriber(new RegisterClockMockSubscriber($reader)); $facade->registerSubscriber(new EnableClockMockSubscriber($reader)); - $facade->registerSubscriber(new DisableClockMockSubscriber($reader)); + $facade->registerSubscriber(new class($reader) implements ErroredSubscriber { + public function __construct(private AttributeReader $reader) + { + } + + public function notify(Errored $event): void + { + SymfonyExtension::disableClockMock($event->test(), $this->reader); + SymfonyExtension::disableDnsMock($event->test(), $this->reader); + } + }); + $facade->registerSubscriber(new class($reader) implements FinishedSubscriber { + public function __construct(private AttributeReader $reader) + { + } + + public function notify(Finished $event): void + { + SymfonyExtension::disableClockMock($event->test(), $this->reader); + SymfonyExtension::disableDnsMock($event->test(), $this->reader); + } + }); + $facade->registerSubscriber(new class($reader) implements SkippedSubscriber { + public function __construct(private AttributeReader $reader) + { + } + + public function notify(Skipped $event): void + { + SymfonyExtension::disableClockMock($event->test(), $this->reader); + SymfonyExtension::disableDnsMock($event->test(), $this->reader); + } + }); + + if (interface_exists(BeforeTestMethodErroredSubscriber::class)) { + $facade->registerSubscriber(new class($reader) implements BeforeTestMethodErroredSubscriber { + public function __construct(private AttributeReader $reader) + { + } + + public function notify(BeforeTestMethodErrored $event): void + { + if (method_exists($event, 'test')) { + SymfonyExtension::disableClockMock($event->test(), $this->reader); + SymfonyExtension::disableDnsMock($event->test(), $this->reader); + } else { + ClockMock::withClockMock(false); + DnsMock::withMockedHosts([]); + } + } + }); + } if ($parameters->has('dns-mock-namespaces')) { foreach (explode(',', $parameters->get('dns-mock-namespaces')) as $namespace) { @@ -50,6 +112,43 @@ public function bootstrap(Configuration $configuration, Facade $facade, Paramete } $facade->registerSubscriber(new RegisterDnsMockSubscriber($reader)); - $facade->registerSubscriber(new DisableDnsMockSubscriber($reader)); + } + + /** + * @internal + */ + public static function disableClockMock(Test $test, AttributeReader $reader): void + { + if (self::hasGroup($test, 'time-sensitive', $reader, TimeSensitive::class)) { + ClockMock::withClockMock(false); + } + } + + /** + * @internal + */ + public static function disableDnsMock(Test $test, AttributeReader $reader): void + { + if (self::hasGroup($test, 'dns-sensitive', $reader, DnsSensitive::class)) { + DnsMock::withMockedHosts([]); + } + } + + /** + * @internal + */ + public static function hasGroup(Test $test, string $groupName, AttributeReader $reader, string $attribute): bool + { + if (!$test instanceof TestMethod) { + return false; + } + + foreach ($test->metadata() as $metadata) { + if ($metadata instanceof Group && $groupName === $metadata->groupName()) { + return true; + } + } + + return [] !== $reader->forClassAndMethod($test->className(), $test->methodName(), $attribute); } } 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 3616e5096c3b7..385e7ea7e51e4 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php +++ b/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php @@ -23,8 +23,6 @@ require __DIR__.'/../../../../SymfonyExtension.php'; require __DIR__.'/../../../../Attribute/DnsSensitive.php'; require __DIR__.'/../../../../Attribute/TimeSensitive.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 933352f07eadc..dd26388e71fd6 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 5fddda14eb847..24d593406c87a 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/CHANGELOG.md b/src/Symfony/Bridge/Twig/CHANGELOG.md index 8029cb4e4a464..d6d929cb50ed6 100644 --- a/src/Symfony/Bridge/Twig/CHANGELOG.md +++ b/src/Symfony/Bridge/Twig/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG * Add `field_id()` Twig form helper function * Add a `Twig` constraint that validates Twig templates * Make `lint:twig` collect all deprecations instead of stopping at the first one + * Add `name` argument to `email.image` to override the attachment file name being set as the file path 7.2 --- 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/WrappedTemplatedEmail.php b/src/Symfony/Bridge/Twig/Mime/WrappedTemplatedEmail.php index a327e94b3321e..1feedc20370bb 100644 --- a/src/Symfony/Bridge/Twig/Mime/WrappedTemplatedEmail.php +++ b/src/Symfony/Bridge/Twig/Mime/WrappedTemplatedEmail.php @@ -39,14 +39,16 @@ public function toName(): string * some Twig namespace for email images (e.g. '@email/images/logo.png'). * @param string|null $contentType The media type (i.e. MIME type) of the image file (e.g. 'image/png'). * Some email clients require this to display embedded images. + * @param string|null $name A custom file name that overrides the original name (filepath) of the image */ - public function image(string $image, ?string $contentType = null): string + public function image(string $image, ?string $contentType = null, ?string $name = null): string { $file = $this->twig->getLoader()->getSourceContext($image); $body = $file->getPath() ? new File($file->getPath()) : $file->getCode(); - $this->message->addPart((new DataPart($body, $image, $contentType))->asInline()); + $name = $name ?: $image; + $this->message->addPart((new DataPart($body, $name, $contentType))->asInline()); - return 'cid:'.$image; + return 'cid:'.$name; } /** diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo1.png b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo1.png new file mode 100644 index 0000000000000..519ab7c691ba9 Binary files /dev/null and b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo1.png differ diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo2.png b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo2.png new file mode 120000 index 0000000000000..e9f523cbd5b31 --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo2.png @@ -0,0 +1 @@ +logo1.png \ No newline at end of file diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/attach.html.twig b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/attach.html.twig new file mode 100644 index 0000000000000..e70e32fbcb757 --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/attach.html.twig @@ -0,0 +1,3 @@ +

Attachments

+{{ email.attach('@assets/images/logo1.png') }} +{{ email.attach('@assets/images/logo2.png', name='image.png') }} diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/image.html.twig b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/image.html.twig new file mode 100644 index 0000000000000..074edf4c91b2f --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/image.html.twig @@ -0,0 +1,2 @@ + + diff --git a/src/Symfony/Bridge/Twig/Tests/Mime/WrappedTemplatedEmailTest.php b/src/Symfony/Bridge/Twig/Tests/Mime/WrappedTemplatedEmailTest.php new file mode 100644 index 0000000000000..428ebc93dc4ab --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Mime/WrappedTemplatedEmailTest.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Twig\Tests\Mime; + +use PHPUnit\Framework\TestCase; +use Symfony\Bridge\Twig\Mime\BodyRenderer; +use Symfony\Bridge\Twig\Mime\TemplatedEmail; +use Twig\Environment; +use Twig\Loader\FilesystemLoader; + +/** + * @author Alexander Hofbauer buildEmail('email/image.html.twig'); + $body = $email->toString(); + $contentId1 = $email->getAttachments()[0]->getContentId(); + $contentId2 = $email->getAttachments()[1]->getContentId(); + + $part1 = str_replace("\n", "\r\n", + << + Content-Type: image/png; name="$contentId1" + Content-Transfer-Encoding: base64 + Content-Disposition: inline; + name="$contentId1"; + filename="@assets/images/logo1.png" + + PART + ); + + $part2 = str_replace("\n", "\r\n", + << + Content-Type: image/png; name="$contentId2" + Content-Transfer-Encoding: base64 + Content-Disposition: inline; + name="$contentId2"; filename=image.png + + PART + ); + + self::assertStringContainsString('![](cid:@assets/images/logo1.png)![](cid:image.png)', $body); + self::assertStringContainsString($part1, $body); + self::assertStringContainsString($part2, $body); + } + + public function testEmailAttach() + { + $email = $this->buildEmail('email/attach.html.twig'); + $body = $email->toString(); + + $part1 = str_replace("\n", "\r\n", + <<from('a.hofbauer@fify.at') + ->htmlTemplate($template); + + $loader = new FilesystemLoader(\dirname(__DIR__).'/Fixtures/templates/'); + $loader->addPath(\dirname(__DIR__).'/Fixtures/assets', 'assets'); + + $environment = new Environment($loader); + $renderer = new BodyRenderer($environment); + $renderer->render($email); + + return $email; + } +} diff --git a/src/Symfony/Bridge/Twig/Validator/Constraints/TwigValidator.php b/src/Symfony/Bridge/Twig/Validator/Constraints/TwigValidator.php index de92a36272963..3064341f3b10d 100644 --- a/src/Symfony/Bridge/Twig/Validator/Constraints/TwigValidator.php +++ b/src/Symfony/Bridge/Twig/Validator/Constraints/TwigValidator.php @@ -45,26 +45,33 @@ public function validate(mixed $value, Constraint $constraint): void $value = (string) $value; - if (!$constraint->skipDeprecations) { - $prevErrorHandler = set_error_handler(static function ($level, $message, $file, $line) use (&$prevErrorHandler) { - if (\E_USER_DEPRECATED !== $level) { - return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false; - } - - $templateLine = 0; - if (preg_match('/ at line (\d+)[ .]/', $message, $matches)) { - $templateLine = $matches[1]; - } - - throw new Error($message, $templateLine); - }); - } - $realLoader = $this->twig->getLoader(); try { $temporaryLoader = new ArrayLoader([$value]); $this->twig->setLoader($temporaryLoader); - $this->twig->parse($this->twig->tokenize(new Source($value, ''))); + + if (!$constraint->skipDeprecations) { + $prevErrorHandler = set_error_handler(static function ($level, $message, $file, $line) use (&$prevErrorHandler) { + if (\E_USER_DEPRECATED !== $level) { + return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false; + } + + $templateLine = 0; + if (preg_match('/ at line (\d+)[ .]/', $message, $matches)) { + $templateLine = $matches[1]; + } + + throw new Error($message, $templateLine); + }); + } + + try { + $this->twig->parse($this->twig->tokenize(new Source($value, ''))); + } finally { + if (!$constraint->skipDeprecations) { + restore_error_handler(); + } + } } catch (Error $e) { $this->context->buildViolation($constraint->message) ->setParameter('{{ error }}', $e->getMessage()) @@ -73,9 +80,6 @@ public function validate(mixed $value, Constraint $constraint): void ->addViolation(); } finally { $this->twig->setLoader($realLoader); - if (!$constraint->skipDeprecations) { - restore_error_handler(); - } } } } diff --git a/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php index 4dbdc4c7abb81..a72034d98293a 100644 --- a/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php @@ -26,7 +26,9 @@ public function getConfigTreeBuilder(): TreeBuilder $treeBuilder = new TreeBuilder('debug'); $rootNode = $treeBuilder->getRootNode(); - $rootNode->children() + $rootNode + ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/debug.html', 'symfony/debug-bundle') + ->children() ->integerNode('max_items') ->info('Max number of displayed items past the first level, -1 means no limit.') ->min(-1) diff --git a/src/Symfony/Bundle/DebugBundle/composer.json b/src/Symfony/Bundle/DebugBundle/composer.json index d00a4db6424c0..31b480091abdc 100644 --- a/src/Symfony/Bundle/DebugBundle/composer.json +++ b/src/Symfony/Bundle/DebugBundle/composer.json @@ -18,19 +18,16 @@ "require": { "php": ">=8.2", "ext-xml": "*", + "composer-runtime-api": ">=2.1", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/twig-bridge": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0" }, "require-dev": { - "symfony/config": "^6.4|^7.0", "symfony/web-profiler-bundle": "^6.4|^7.0" }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4" - }, "autoload": { "psr-4": { "Symfony\\Bundle\\DebugBundle\\": "" }, "exclude-from-classmap": [ diff --git a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md index 6c4daeb6df85d..ce62c9cdf836b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md @@ -4,6 +4,34 @@ CHANGELOG 7.3 --- + * Add `errors.php` and `webhook.php` routing configuration files (use them instead of their XML equivalent) + + Before: + + ```yaml + when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + prefix: /_error + + webhook: + resource: '@FrameworkBundle/Resources/config/routing/webhook.xml' + prefix: /webhook + ``` + + After: + + ```yaml + when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.php' + prefix: /_error + + webhook: + resource: '@FrameworkBundle/Resources/config/routing/webhook.php' + prefix: /webhook + ``` + * Add support for the ObjectMapper component * Add support for assets pre-compression * Rename `TranslationUpdateCommand` to `TranslationExtractCommand` @@ -22,6 +50,12 @@ CHANGELOG * Enable service argument resolution on classes that use the `#[Route]` attribute, the `#[AsController]` attribute is no longer required * Deprecate setting the `framework.profiler.collect_serializer_data` config option to `false` + * Set `framework.rate_limiter.limiters.*.lock_factory` to `auto` by default + * Deprecate `RateLimiterFactory` autowiring aliases, use `RateLimiterFactoryInterface` instead + * Allow configuring compound rate limiters + * Make `ValidatorCacheWarmer` use `kernel.build_dir` instead of `cache_dir` + * Make `SerializeCacheWarmer` use `kernel.build_dir` instead of `cache_dir` + * Support executing custom workflow validators during container compilation 7.2 --- diff --git a/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/SerializerCacheWarmer.php b/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/SerializerCacheWarmer.php index 46da4daaab4d1..fbf7083b70b28 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/SerializerCacheWarmer.php +++ b/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/SerializerCacheWarmer.php @@ -41,6 +41,9 @@ public function __construct( protected function doWarmUp(string $cacheDir, ArrayAdapter $arrayAdapter, ?string $buildDir = null): bool { + if (!$buildDir) { + return false; + } if (!$this->loaders) { return true; } diff --git a/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/ValidatorCacheWarmer.php b/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/ValidatorCacheWarmer.php index 6ecaa4bd14d01..9c313f80a8662 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/ValidatorCacheWarmer.php +++ b/src/Symfony/Bundle/FrameworkBundle/CacheWarmer/ValidatorCacheWarmer.php @@ -41,6 +41,10 @@ public function __construct( protected function doWarmUp(string $cacheDir, ArrayAdapter $arrayAdapter, ?string $buildDir = null): bool { + if (!$buildDir) { + return false; + } + $loaders = $this->validatorBuilder->getLoaders(); $metadataFactory = new LazyLoadingMetadataFactory(new LoaderChain($loaders), $arrayAdapter); diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php index 55c101e9c29e3..8d5f85ceea4ca 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php @@ -104,6 +104,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io->title( \sprintf('Current configuration for %s', $name === $extensionAlias ? \sprintf('extension with alias "%s"', $extensionAlias) : \sprintf('"%s"', $name)) ); + + if ($docUrl = $this->getDocUrl($extension, $container)) { + $io->comment(\sprintf('Documentation at %s', $docUrl)); + } } $io->writeln($this->convertToFormat([$extensionAlias => $config], $format)); @@ -269,4 +273,15 @@ private function getAvailableFormatOptions(): array { return ['txt', 'yaml', 'json']; } + + private function getDocUrl(ExtensionInterface $extension, ContainerBuilder $container): ?string + { + $configuration = $extension instanceof ConfigurationInterface ? $extension : $extension->getConfiguration($container->getExtensionConfig($extension->getAlias()), $container); + + return $configuration + ->getConfigTreeBuilder() + ->getRootNode() + ->getNode(true) + ->getAttribute('docUrl'); + } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php index 7e5cd765fd2d3..3cb744d746cae 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php @@ -23,6 +23,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface; use Symfony\Component\Yaml\Yaml; /** @@ -123,6 +124,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int $message .= \sprintf(' at path "%s"', $path); } + if ($docUrl = $this->getExtensionDocUrl($extension)) { + $message .= \sprintf(' (see %s)', $docUrl); + } + switch ($format) { case 'yaml': $io->writeln(\sprintf('# %s', $message)); @@ -182,4 +187,18 @@ private function getAvailableFormatOptions(): array { return ['yaml', 'xml']; } + + private function getExtensionDocUrl(ConfigurationInterface|ConfigurationExtensionInterface $extension): ?string + { + $kernel = $this->getApplication()->getKernel(); + $container = $this->getContainerBuilder($kernel); + + $configuration = $extension instanceof ConfigurationInterface ? $extension : $extension->getConfiguration($container->getExtensionConfig($extension->getAlias()), $container); + + return $configuration + ->getConfigTreeBuilder() + ->getRootNode() + ->getNode(true) + ->getAttribute('docUrl'); + } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/SecretsRevealCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/SecretsRevealCommand.php index 150186b1d37ba..c2110ee76f683 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/SecretsRevealCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/SecretsRevealCommand.php @@ -61,6 +61,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (!\array_key_exists($name, $secrets)) { $io->error(\sprintf('The secret "%s" does not exist.', $name)); + return self::INVALID; + } elseif (null === $secrets[$name]) { + $io->error(\sprintf('The secret "%s" could not be decrypted.', $name)); + return self::INVALID; } diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index aa61cb12c56f4..f4e137f04b980 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -48,9 +48,11 @@ 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; +use Symfony\Component\Workflow\Validator\DefinitionValidatorInterface; use Symfony\Component\Workflow\WorkflowEvents; /** @@ -75,6 +77,7 @@ public function getConfigTreeBuilder(): TreeBuilder $rootNode = $treeBuilder->getRootNode(); $rootNode + ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/framework.html', 'symfony/framework-bundle') ->beforeNormalization() ->ifTrue(fn ($v) => !isset($v['assets']) && isset($v['templating']) && class_exists(Package::class)) ->then(function ($v) { @@ -254,6 +257,7 @@ private function addFormSection(ArrayNodeDefinition $rootNode, callable $enableI ->arrayNode('field_attr') ->performNoDeepMerging() ->normalizeKeys(false) + ->useAttributeAsKey('name') ->scalarPrototype()->end() ->defaultValue(['data-controller' => 'csrf-protection']) ->end() @@ -401,6 +405,7 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode): void ->useAttributeAsKey('name') ->prototype('array') ->fixXmlConfig('support') + ->fixXmlConfig('definition_validator') ->fixXmlConfig('place') ->fixXmlConfig('transition') ->fixXmlConfig('event_to_dispatch', 'events_to_dispatch') @@ -430,11 +435,28 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode): void ->prototype('scalar') ->cannotBeEmpty() ->validate() - ->ifTrue(fn ($v) => !class_exists($v) && !interface_exists($v, false)) + ->ifTrue(static fn ($v) => !class_exists($v) && !interface_exists($v, false)) ->thenInvalid('The supported class or interface "%s" does not exist.') ->end() ->end() ->end() + ->arrayNode('definition_validators') + ->prototype('scalar') + ->cannotBeEmpty() + ->validate() + ->ifTrue(static fn ($v) => !class_exists($v)) + ->thenInvalid('The validation class %s does not exist.') + ->end() + ->validate() + ->ifTrue(static fn ($v) => !is_a($v, DefinitionValidatorInterface::class, true)) + ->thenInvalid(\sprintf('The validation class %%s is not an instance of "%s".', DefinitionValidatorInterface::class)) + ->end() + ->validate() + ->ifTrue(static fn ($v) => 1 <= (new \ReflectionClass($v))->getConstructor()?->getNumberOfRequiredParameters()) + ->thenInvalid('The %s validation class constructor must not have any arguments.') + ->end() + ->end() + ->end() ->scalarNode('support_strategy') ->cannotBeEmpty() ->end() @@ -446,7 +468,7 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode): void ->variableNode('events_to_dispatch') ->defaultValue(null) ->validate() - ->ifTrue(function ($v) { + ->ifTrue(static function ($v) { if (null === $v) { return false; } @@ -473,14 +495,14 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode): void ->arrayNode('places') ->beforeNormalization() ->always() - ->then(function ($places) { + ->then(static function ($places) { if (!\is_array($places)) { throw new InvalidConfigurationException('The "places" option must be an array in workflow configuration.'); } // It's an indexed array of shape ['place1', 'place2'] if (isset($places[0]) && \is_string($places[0])) { - return array_map(function (string $place) { + return array_map(static function (string $place) { return ['name' => $place]; }, $places); } @@ -520,7 +542,7 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode): void ->arrayNode('transitions') ->beforeNormalization() ->always() - ->then(function ($transitions) { + ->then(static function ($transitions) { if (!\is_array($transitions)) { throw new InvalidConfigurationException('The "transitions" option must be an array in workflow configuration.'); } @@ -587,20 +609,20 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode): void ->end() ->end() ->validate() - ->ifTrue(function ($v) { + ->ifTrue(static function ($v) { return $v['supports'] && isset($v['support_strategy']); }) ->thenInvalid('"supports" and "support_strategy" cannot be used together.') ->end() ->validate() - ->ifTrue(function ($v) { + ->ifTrue(static function ($v) { return !$v['supports'] && !isset($v['support_strategy']); }) ->thenInvalid('"supports" or "support_strategy" should be configured.') ->end() ->beforeNormalization() ->always() - ->then(function ($values) { + ->then(static function ($values) { // Special case to deal with XML when the user wants an empty array if (\array_key_exists('event_to_dispatch', $values) && null === $values['event_to_dispatch']) { $values['events_to_dispatch'] = []; @@ -1074,7 +1096,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') @@ -1268,7 +1290,7 @@ private function addPropertyInfoSection(ArrayNodeDefinition $rootNode, callable ->then(function ($v) { $v['property_info']['with_constructor_extractor'] = false; - trigger_deprecation('symfony/framework-bundle', '7.3', 'Not setting the "with_constructor_extractor" option explicitly is deprecated because its default value will change in version 8.0.'); + trigger_deprecation('symfony/framework-bundle', '7.3', 'Not setting the "property_info.with_constructor_extractor" option explicitly is deprecated because its default value will change in version 8.0.'); return $v; }) @@ -2349,7 +2371,7 @@ private function addMailerSection(ArrayNodeDefinition $rootNode, callable $enabl ->info('S/MIME encrypter configuration') ->children() ->scalarNode('repository') - ->info('Path to the S/MIME certificate repository. Shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`.') + ->info('S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`.') ->defaultValue('') ->cannotBeEmpty() ->end() @@ -2504,7 +2526,7 @@ private function addRateLimiterSection(ArrayNodeDefinition $rootNode, callable $ ->children() ->scalarNode('lock_factory') ->info('The service ID of the lock factory used by this limiter (or null to disable locking).') - ->defaultValue('lock.factory') + ->defaultValue('auto') ->end() ->scalarNode('cache_pool') ->info('The cache pool to use for storing the current limiter state.') @@ -2517,7 +2539,12 @@ private function addRateLimiterSection(ArrayNodeDefinition $rootNode, callable $ ->enumNode('policy') ->info('The algorithm to be used by this limiter.') ->isRequired() - ->values(['fixed_window', 'token_bucket', 'sliding_window', 'no_limit']) + ->values(['fixed_window', 'token_bucket', 'sliding_window', 'compound', 'no_limit']) + ->end() + ->arrayNode('limiters') + ->info('The limiter names to use when using the "compound" policy.') + ->beforeNormalization()->castToArray()->end() + ->scalarPrototype()->end() ->end() ->integerNode('limit') ->info('The maximum allowed hits in a fixed interval or burst.') @@ -2536,8 +2563,8 @@ private function addRateLimiterSection(ArrayNodeDefinition $rootNode, callable $ ->end() ->end() ->validate() - ->ifTrue(fn ($v) => 'no_limit' !== $v['policy'] && !isset($v['limit'])) - ->thenInvalid('A limit must be provided when using a policy different than "no_limit".') + ->ifTrue(static fn ($v) => !\in_array($v['policy'], ['no_limit', 'compound']) && !isset($v['limit'])) + ->thenInvalid('A limit must be provided when using a policy different than "compound" or "no_limit".') ->end() ->end() ->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 1a1bcdd162d5d..05504af2e15a7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -59,6 +59,7 @@ use Symfony\Component\Console\Debug\CliRequest; use Symfony\Component\Console\Messenger\RunCommandMessageHandler; use Symfony\Component\DependencyInjection\Alias; +use Symfony\Component\DependencyInjection\Argument\IteratorArgument; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; @@ -105,6 +106,7 @@ use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface; use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\HttpKernel\Log\DebugLoggerConfigurator; +use Symfony\Component\HttpKernel\Profiler\ProfilerStateChecker; use Symfony\Component\JsonStreamer\Attribute\JsonStreamable; use Symfony\Component\JsonStreamer\JsonStreamWriter; use Symfony\Component\JsonStreamer\StreamReaderInterface; @@ -125,6 +127,7 @@ use Symfony\Component\Messenger\Attribute\AsMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\Bridge as MessengerBridge; +use Symfony\Component\Messenger\EventListener\ResetMemoryUsageListener; use Symfony\Component\Messenger\Handler\BatchHandlerInterface; use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\MessageBusInterface; @@ -158,6 +161,7 @@ use Symfony\Component\PropertyInfo\PropertyInitializableExtractorInterface; use Symfony\Component\PropertyInfo\PropertyListExtractorInterface; use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface; +use Symfony\Component\RateLimiter\CompoundRateLimiterFactory; use Symfony\Component\RateLimiter\LimiterInterface; use Symfony\Component\RateLimiter\RateLimiterFactory; use Symfony\Component\RateLimiter\RateLimiterFactoryInterface; @@ -298,6 +302,10 @@ public function load(array $configs, ContainerBuilder $container): void // Load Cache configuration first as it is used by other components $loader->load('cache.php'); + if (!interface_exists(NamespacedPoolInterface::class)) { + $container->removeAlias(NamespacedPoolInterface::class); + } + $configuration = $this->getConfiguration($configs, $container); $config = $this->processConfiguration($configuration, $configs); @@ -565,9 +573,9 @@ public function load(array $configs, ContainerBuilder $container): void $container->removeDefinition('console.command.scheduler_debug'); } - // messenger depends on validation being registered + // messenger depends on validation, and lock being registered if ($messengerEnabled) { - $this->registerMessengerConfiguration($config['messenger'], $container, $loader, $this->readConfigEnabled('validation', $container, $config['validation']), $this->readConfigEnabled('lock', $container, $config['lock'])); + $this->registerMessengerConfiguration($config['messenger'], $container, $loader, $this->readConfigEnabled('validation', $container, $config['validation']), $this->readConfigEnabled('lock', $container, $config['lock']) && ($config['lock']['resources']['default'] ?? false)); } else { $container->removeDefinition('console.command.messenger_consume_messages'); $container->removeDefinition('console.command.messenger_stats'); @@ -638,6 +646,14 @@ public function load(array $configs, ContainerBuilder $container): void $loader->load('mime_type.php'); } + if (ContainerBuilder::willBeAvailable('symfony/object-mapper', ObjectMapperInterface::class, ['symfony/framework-bundle'])) { + $loader->load('object_mapper.php'); + $container->registerForAutoconfiguration(TransformCallableInterface::class) + ->addTag('object_mapper.transform_callable'); + $container->registerForAutoconfiguration(ConditionCallableInterface::class) + ->addTag('object_mapper.condition_callable'); + } + $container->registerForAutoconfiguration(PackageInterface::class) ->addTag('assets.package'); $container->registerForAutoconfiguration(AssetCompilerInterface::class) @@ -787,34 +803,34 @@ static function (ChildDefinition $definition, AsPeriodicTask|AsCronTask $attribu } $container->registerForAutoconfiguration(CompilerPassInterface::class) - ->addTag('container.excluded', ['source' => 'because it\'s a compiler pass'])->setAbstract(true); + ->addTag('container.excluded', ['source' => 'because it\'s a compiler pass']); $container->registerForAutoconfiguration(Constraint::class) - ->addTag('container.excluded', ['source' => 'because it\'s a validation constraint'])->setAbstract(true); + ->addTag('container.excluded', ['source' => 'because it\'s a validation constraint']); $container->registerForAutoconfiguration(TestCase::class) - ->addTag('container.excluded', ['source' => 'because it\'s a test case'])->setAbstract(true); + ->addTag('container.excluded', ['source' => 'because it\'s a test case']); $container->registerForAutoconfiguration(\UnitEnum::class) - ->addTag('container.excluded', ['source' => 'because it\'s an enum'])->setAbstract(true); + ->addTag('container.excluded', ['source' => 'because it\'s an enum']); $container->registerAttributeForAutoconfiguration(AsMessage::class, static function (ChildDefinition $definition) { - $definition->addTag('container.excluded', ['source' => 'because it\'s a messenger message'])->setAbstract(true); + $definition->addTag('container.excluded', ['source' => 'because it\'s a messenger message']); }); $container->registerAttributeForAutoconfiguration(\Attribute::class, static function (ChildDefinition $definition) { - $definition->addTag('container.excluded', ['source' => 'because it\'s an attribute'])->setAbstract(true); + $definition->addTag('container.excluded', ['source' => 'because it\'s a PHP attribute']); }); $container->registerAttributeForAutoconfiguration(Entity::class, static function (ChildDefinition $definition) { - $definition->addTag('container.excluded', ['source' => 'because it\'s a doctrine entity'])->setAbstract(true); + $definition->addTag('container.excluded', ['source' => 'because it\'s a Doctrine entity']); }); $container->registerAttributeForAutoconfiguration(Embeddable::class, static function (ChildDefinition $definition) { - $definition->addTag('container.excluded', ['source' => 'because it\'s a doctrine embeddable'])->setAbstract(true); + $definition->addTag('container.excluded', ['source' => 'because it\'s a Doctrine embeddable']); }); $container->registerAttributeForAutoconfiguration(MappedSuperclass::class, static function (ChildDefinition $definition) { - $definition->addTag('container.excluded', ['source' => 'because it\'s a doctrine mapped superclass'])->setAbstract(true); + $definition->addTag('container.excluded', ['source' => 'because it\'s a Doctrine mapped superclass']); }); $container->registerAttributeForAutoconfiguration(JsonStreamable::class, static function (ChildDefinition $definition, JsonStreamable $attribute) { $definition->addTag('json_streamer.streamable', [ 'object' => $attribute->asObject, 'list' => $attribute->asList, - ])->addTag('container.excluded', ['source' => 'because it\'s a streamable JSON'])->setAbstract(true); + ])->addTag('container.excluded', ['source' => 'because it\'s a streamable JSON']); }); if (!$container->getParameter('kernel.debug')) { @@ -822,7 +838,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'); } @@ -876,14 +892,6 @@ private function registerFormConfiguration(array $config, ContainerBuilder $cont if (!ContainerBuilder::willBeAvailable('symfony/translation', Translator::class, ['symfony/framework-bundle', 'symfony/form'])) { $container->removeDefinition('form.type_extension.upload.validator'); } - - if (ContainerBuilder::willBeAvailable('symfony/object-mapper', ObjectMapperInterface::class, ['symfony/framework-bundle'])) { - $loader->load('object_mapper.php'); - $container->registerForAutoconfiguration(TransformCallableInterface::class) - ->addTag('object_mapper.transform_callable'); - $container->registerForAutoconfiguration(ConditionCallableInterface::class) - ->addTag('object_mapper.condition_callable'); - } } private function registerHttpCacheConfiguration(array $config, ContainerBuilder $container, bool $httpMethodOverride): void @@ -960,6 +968,11 @@ private function registerProfilerConfiguration(array $config, ContainerBuilder $ $loader->load('collectors.php'); $loader->load('cache_debug.php'); + if (!class_exists(ProfilerStateChecker::class)) { + $container->removeDefinition('profiler.state_checker'); + $container->removeDefinition('profiler.is_disabled_state_checker'); + } + if ($this->isInitializedConfigEnabled('form')) { $loader->load('form_debug.php'); } @@ -1114,7 +1127,8 @@ private function registerWorkflowConfiguration(array $config, ContainerBuilder $ } } $metadataStoreDefinition->replaceArgument(2, $transitionsMetadataDefinition); - $container->setDefinition(\sprintf('%s.metadata_store', $workflowId), $metadataStoreDefinition); + $metadataStoreId = \sprintf('%s.metadata_store', $workflowId); + $container->setDefinition($metadataStoreId, $metadataStoreDefinition); // Create places $places = array_column($workflow['places'], 'name'); @@ -1125,7 +1139,8 @@ private function registerWorkflowConfiguration(array $config, ContainerBuilder $ $definitionDefinition->addArgument($places); $definitionDefinition->addArgument($transitions); $definitionDefinition->addArgument($initialMarking); - $definitionDefinition->addArgument(new Reference(\sprintf('%s.metadata_store', $workflowId))); + $definitionDefinition->addArgument(new Reference($metadataStoreId)); + $definitionDefinitionId = \sprintf('%s.definition', $workflowId); // Create MarkingStore $markingStoreDefinition = null; @@ -1139,14 +1154,26 @@ private function registerWorkflowConfiguration(array $config, ContainerBuilder $ $markingStoreDefinition = new Reference($workflow['marking_store']['service']); } + // Validation + $workflow['definition_validators'][] = match ($workflow['type']) { + 'state_machine' => Workflow\Validator\StateMachineValidator::class, + 'workflow' => Workflow\Validator\WorkflowValidator::class, + default => throw new \LogicException(\sprintf('Invalid workflow type "%s".', $workflow['type'])), + }; + // Create Workflow $workflowDefinition = new ChildDefinition(\sprintf('%s.abstract', $type)); - $workflowDefinition->replaceArgument(0, new Reference(\sprintf('%s.definition', $workflowId))); + $workflowDefinition->replaceArgument(0, new Reference($definitionDefinitionId)); $workflowDefinition->replaceArgument(1, $markingStoreDefinition); $workflowDefinition->replaceArgument(3, $name); $workflowDefinition->replaceArgument(4, $workflow['events_to_dispatch']); - $workflowDefinition->addTag('workflow', ['name' => $name, 'metadata' => $workflow['metadata']]); + $workflowDefinition->addTag('workflow', [ + 'name' => $name, + 'metadata' => $workflow['metadata'], + 'definition_validators' => $workflow['definition_validators'], + 'definition_id' => $definitionDefinitionId, + ]); if ('workflow' === $type) { $workflowDefinition->addTag('workflow.workflow', ['name' => $name]); } elseif ('state_machine' === $type) { @@ -1155,21 +1182,10 @@ private function registerWorkflowConfiguration(array $config, ContainerBuilder $ // Store to container $container->setDefinition($workflowId, $workflowDefinition); - $container->setDefinition(\sprintf('%s.definition', $workflowId), $definitionDefinition); + $container->setDefinition($definitionDefinitionId, $definitionDefinition); $container->registerAliasForArgument($workflowId, WorkflowInterface::class, $name.'.'.$type); $container->registerAliasForArgument($workflowId, WorkflowInterface::class, $name); - // Validate Workflow - if ('state_machine' === $workflow['type']) { - $validator = new Workflow\Validator\StateMachineValidator(); - } else { - $validator = new Workflow\Validator\WorkflowValidator(); - } - - $trs = array_map(fn (Reference $ref): Workflow\Transition => $container->get((string) $ref), $transitions); - $realDefinition = new Workflow\Definition($places, $trs, $initialMarking); - $validator->validate($realDefinition, $name); - // Add workflow to Registry if ($workflow['supports']) { foreach ($workflow['supports'] as $supportedClassName) { @@ -2281,7 +2297,7 @@ private function registerSchedulerConfiguration(ContainerBuilder $container, Php } // BC layer Scheduler < 7.3 - if (!class_exists(SchedulerTriggerNormalizer::class)) { + if (!ContainerBuilder::willBeAvailable('symfony/serializer', DenormalizerInterface::class, ['symfony/framework-bundle', 'symfony/scheduler']) || !class_exists(SchedulerTriggerNormalizer::class)) { $container->removeDefinition('serializer.normalizer.scheduler_trigger'); } } @@ -2302,6 +2318,10 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder $container->removeDefinition('serializer.normalizer.flatten_exception'); } + if (!class_exists(ResetMemoryUsageListener::class)) { + $container->removeDefinition('messenger.listener.reset_memory_usage'); + } + if (ContainerBuilder::willBeAvailable('symfony/amqp-messenger', MessengerBridge\Amqp\Transport\AmqpTransportFactory::class, ['symfony/framework-bundle', 'symfony/messenger'])) { $container->getDefinition('messenger.transport.amqp.factory')->addTag('messenger.transport_factory'); } @@ -3232,13 +3252,30 @@ private function registerRateLimiterConfiguration(array $config, ContainerBuilde { $loader->load('rate_limiter.php'); + $limiters = []; + $compoundLimiters = []; + foreach ($config['limiters'] as $name => $limiterConfig) { + if ('compound' === $limiterConfig['policy']) { + $compoundLimiters[$name] = $limiterConfig; + + continue; + } + + unset($limiterConfig['limiters']); + + $limiters[] = $name; + // default configuration (when used by other DI extensions) $limiterConfig += ['lock_factory' => 'lock.factory', 'cache_pool' => 'cache.rate_limiter']; $limiter = $container->setDefinition($limiterId = 'limiter.'.$name, new ChildDefinition('limiter')) ->addTag('rate_limiter', ['name' => $name]); + if ('auto' === $limiterConfig['lock_factory']) { + $limiterConfig['lock_factory'] = $this->isInitializedConfigEnabled('lock') ? 'lock.factory' : null; + } + if (null !== $limiterConfig['lock_factory']) { if (!interface_exists(LockInterface::class)) { throw new LogicException(\sprintf('Rate limiter "%s" requires the Lock component to be installed. Try running "composer require symfony/lock".', $name)); @@ -3262,11 +3299,36 @@ private function registerRateLimiterConfiguration(array $config, ContainerBuilde $limiterConfig['id'] = $name; $limiter->replaceArgument(0, $limiterConfig); - $container->registerAliasForArgument($limiterId, RateLimiterFactory::class, $name.'.limiter'); + $factoryAlias = $container->registerAliasForArgument($limiterId, RateLimiterFactory::class, $name.'.limiter'); if (interface_exists(RateLimiterFactoryInterface::class)) { $container->registerAliasForArgument($limiterId, RateLimiterFactoryInterface::class, $name.'.limiter'); + $factoryAlias->setDeprecated('symfony/dependency-injection', '7.3', 'The "%alias_id%" autowiring alias is deprecated and will be removed in 8.0, use "RateLimiterFactoryInterface" instead.'); + } + } + + if ($compoundLimiters && !class_exists(CompoundRateLimiterFactory::class)) { + throw new LogicException('Configuring compound rate limiters is only available in symfony/rate-limiter 7.3+.'); + } + + foreach ($compoundLimiters as $name => $limiterConfig) { + if (!$limiterConfig['limiters']) { + throw new LogicException(\sprintf('Compound rate limiter "%s" requires at least one sub-limiter.', $name)); } + + if (\array_diff($limiterConfig['limiters'], $limiters)) { + throw new LogicException(\sprintf('Compound rate limiter "%s" requires at least one sub-limiter to be configured.', $name)); + } + + $container->register($limiterId = 'limiter.'.$name, CompoundRateLimiterFactory::class) + ->addTag('rate_limiter', ['name' => $name]) + ->addArgument(new IteratorArgument(\array_map( + static fn (string $name) => new Reference('limiter.'.$name), + $limiterConfig['limiters'] + ))) + ; + + $container->registerAliasForArgument($limiterId, RateLimiterFactoryInterface::class, $name.'.limiter'); } } diff --git a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php index faf2841f40105..300fe22fb37a9 100644 --- a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php +++ b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php @@ -11,6 +11,7 @@ namespace Symfony\Bundle\FrameworkBundle; +use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddDebugLogProcessorPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AssetsContextPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ContainerBuilderDebugDumpPass; @@ -77,6 +78,7 @@ use Symfony\Component\VarExporter\Internal\Registry; use Symfony\Component\Workflow\DependencyInjection\WorkflowDebugPass; use Symfony\Component\Workflow\DependencyInjection\WorkflowGuardListenerPass; +use Symfony\Component\Workflow\DependencyInjection\WorkflowValidatorPass; // Help opcache.preload discover always-needed symbols class_exists(ApcuAdapter::class); @@ -173,6 +175,7 @@ public function build(ContainerBuilder $container): void $container->addCompilerPass(new CachePoolPrunerPass(), PassConfig::TYPE_AFTER_REMOVING); $this->addCompilerPassIfExists($container, FormPass::class); $this->addCompilerPassIfExists($container, WorkflowGuardListenerPass::class); + $this->addCompilerPassIfExists($container, WorkflowValidatorPass::class); $container->addCompilerPass(new ResettableServicePass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -32); $container->addCompilerPass(new RegisterLocaleAwareServicesPass()); $container->addCompilerPass(new TestServiceContainerWeakRefPass(), PassConfig::TYPE_BEFORE_REMOVING, -32); @@ -200,6 +203,14 @@ public function build(ContainerBuilder $container): void } } + /** + * @internal + */ + public static function considerProfilerEnabled(): bool + { + return !($GLOBALS['app'] ?? null) instanceof Application || empty($_GET) && \in_array('--profile', $_SERVER['argv'] ?? [], true); + } + private function addCompilerPassIfExists(ContainerBuilder $container, string $class, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0): void { $container->addResource(new ClassExistenceResource($class)); diff --git a/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php b/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php index 28d616c13e1c1..f40373a302b45 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php +++ b/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php @@ -165,7 +165,6 @@ public function registerContainerConfiguration(LoaderInterface $loader): void ->setPublic(true) ; } - $container->setAlias($kernelClass, 'kernel')->setPublic(true); $kernelDefinition = $container->getDefinition('kernel'); $kernelDefinition->addTag('routing.route_loader'); @@ -198,6 +197,8 @@ public function registerContainerConfiguration(LoaderInterface $loader): void $kernelLoader->registerAliasesForSinglyImplementedInterfaces(); AbstractConfigurator::$valuePreProcessor = $valuePreProcessor; } + + $container->setAlias($kernelClass, 'kernel')->setPublic(true); }); } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php index 3d96ba05994ca..ae9d426a498c6 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/cache.php @@ -28,6 +28,7 @@ use Symfony\Component\Cache\Messenger\EarlyExpirationHandler; use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer; use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Cache\NamespacedPoolInterface; use Symfony\Contracts\Cache\TagAwareCacheInterface; return static function (ContainerConfigurator $container) { @@ -250,6 +251,8 @@ ->alias(CacheInterface::class, 'cache.app') + ->alias(NamespacedPoolInterface::class, 'cache.app') + ->alias(TagAwareCacheInterface::class, 'cache.app.taggable') ; }; diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.php index 5c426653daeca..842f5b35b412a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.php @@ -25,6 +25,7 @@ service('debug.stopwatch'), service('logger')->nullOnInvalid(), service('.virtual_request_stack')->nullOnInvalid(), + service('profiler.is_disabled_state_checker')->nullOnInvalid(), ]) ->tag('monolog.logger', ['channel' => 'event']) ->tag('kernel.reset', ['method' => 'reset']) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php index 880adbb908ebf..43e7fb9a5e4cb 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php @@ -50,7 +50,6 @@ tagged_iterator('mailer.transport_factory'), ]) - ->set('mailer.default_transport', TransportInterface::class) ->alias('mailer.default_transport', 'mailer.transports') ->alias(TransportInterface::class, 'mailer.default_transport') diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php index 8798d5f2e5e3e..e02cd1ca34c0d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php @@ -18,6 +18,7 @@ use Symfony\Component\Messenger\Bridge\Redis\Transport\RedisTransportFactory; use Symfony\Component\Messenger\EventListener\AddErrorDetailsStampListener; use Symfony\Component\Messenger\EventListener\DispatchPcntlSignalListener; +use Symfony\Component\Messenger\EventListener\ResetMemoryUsageListener; use Symfony\Component\Messenger\EventListener\ResetServicesListener; use Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener; use Symfony\Component\Messenger\EventListener\SendFailedMessageToFailureTransportListener; @@ -218,6 +219,9 @@ service('services_resetter'), ]) + ->set('messenger.listener.reset_memory_usage', ResetMemoryUsageListener::class) + ->tag('kernel.event_subscriber') + ->set('messenger.routable_message_bus', RoutableMessageBus::class) ->args([ abstract_arg('message bus locator'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php index 4ae34649b4aaf..a81c53a633461 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php @@ -12,10 +12,12 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; use Symfony\Bundle\FrameworkBundle\EventListener\ConsoleProfilerListener; +use Symfony\Bundle\FrameworkBundle\FrameworkBundle; use Symfony\Component\HttpKernel\Debug\VirtualRequestStack; use Symfony\Component\HttpKernel\EventListener\ProfilerListener; use Symfony\Component\HttpKernel\Profiler\FileProfilerStorage; use Symfony\Component\HttpKernel\Profiler\Profiler; +use Symfony\Component\HttpKernel\Profiler\ProfilerStateChecker; return static function (ContainerConfigurator $container) { $container->services() @@ -56,5 +58,15 @@ ->set('.virtual_request_stack', VirtualRequestStack::class) ->args([service('request_stack')]) ->public() + + ->set('profiler.state_checker', ProfilerStateChecker::class) + ->args([ + service_locator(['profiler' => service('profiler')->ignoreOnUninitialized()]), + inline_service('bool')->factory([FrameworkBundle::class, 'considerProfilerEnabled']), + ]) + + ->set('profiler.is_disabled_state_checker', 'Closure') + ->factory(['Closure', 'fromCallable']) + ->args([[service('profiler.state_checker'), 'isProfilerDisabled']]) ; }; diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/errors.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/errors.php new file mode 100644 index 0000000000000..36a46dee407ea --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/errors.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; +use Symfony\Component\Routing\Loader\XmlFileLoader; + +return function (RoutingConfigurator $routes): void { + foreach (debug_backtrace() as $trace) { + if (isset($trace['object']) && $trace['object'] instanceof XmlFileLoader && 'doImport' === $trace['function']) { + if (__DIR__ === dirname(realpath($trace['args'][3]))) { + trigger_deprecation('symfony/routing', '7.3', 'The "errors.xml" routing configuration file is deprecated, import "errors.php" instead.'); + + break; + } + } + } + + $routes->add('_preview_error', '/{code}.{_format}') + ->controller('error_controller::preview') + ->defaults(['_format' => 'html']) + ->requirements(['code' => '\d+']) + ; +}; diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/errors.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/errors.xml index 13a9cc4076c79..f890aef1e3365 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/errors.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/errors.xml @@ -4,9 +4,5 @@ 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"> - - error_controller::preview - html - \d+ - + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/webhook.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/webhook.php new file mode 100644 index 0000000000000..177606b26214e --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/webhook.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; +use Symfony\Component\Routing\Loader\XmlFileLoader; + +return function (RoutingConfigurator $routes): void { + foreach (debug_backtrace() as $trace) { + if (isset($trace['object']) && $trace['object'] instanceof XmlFileLoader && 'doImport' === $trace['function']) { + if (__DIR__ === dirname(realpath($trace['args'][3]))) { + trigger_deprecation('symfony/routing', '7.3', 'The "webhook.xml" routing configuration file is deprecated, import "webhook.php" instead.'); + + break; + } + } + } + + $routes->add('_webhook_controller', '/{type}') + ->controller('webhook.controller::handle') + ->requirements(['type' => '.+']) + ; +}; diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/webhook.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/webhook.xml index dfa95cfac555e..8cb64ebb74fd7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/webhook.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/webhook.xml @@ -4,8 +4,5 @@ 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"> - - webhook.controller::handle - .+ - + 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 c4ee3486dae87..7f4b48a18b296 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 @@ -80,7 +80,7 @@ - + @@ -449,6 +449,7 @@ + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php index 535b95a399248..e0a256bbe3640 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php @@ -56,7 +56,7 @@ return static function (ContainerConfigurator $container) { $container->parameters() - ->set('serializer.mapping.cache.file', '%kernel.cache_dir%/serialization.php') + ->set('serializer.mapping.cache.file', '%kernel.build_dir%/serialization.php') ; $container->services() diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php index 558c2b6d52334..936867d542afb 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php @@ -158,6 +158,9 @@ class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : [] ->set('uri_signer', UriSigner::class) ->args([ new Parameter('kernel.secret'), + '_hash', + '_expiration', + service('clock')->nullOnInvalid(), ]) ->lazy() ->alias(UriSigner::class, 'uri_signer') diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.php index adde2de238e05..535b42edc1bc3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.php @@ -28,7 +28,7 @@ return static function (ContainerConfigurator $container) { $container->parameters() - ->set('validator.mapping.cache.file', param('kernel.cache_dir').'/validation.php'); + ->set('validator.mapping.cache.file', '%kernel.build_dir%/validation.php'); $validatorsDir = \dirname((new \ReflectionClass(EmailValidator::class))->getFileName()); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator_debug.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator_debug.php index e9fe441140742..b195aea2b57b0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator_debug.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/validator_debug.php @@ -20,6 +20,7 @@ ->decorate('validator', null, 255) ->args([ service('debug.validator.inner'), + service('profiler.is_disabled_state_checker')->nullOnInvalid(), ]) ->tag('kernel.reset', [ 'method' => 'reset', diff --git a/src/Symfony/Bundle/FrameworkBundle/Secrets/AbstractVault.php b/src/Symfony/Bundle/FrameworkBundle/Secrets/AbstractVault.php index 882ec78628839..788601d2e91ed 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Secrets/AbstractVault.php +++ b/src/Symfony/Bundle/FrameworkBundle/Secrets/AbstractVault.php @@ -31,6 +31,9 @@ abstract public function reveal(string $name): ?string; abstract public function remove(string $name): bool; + /** + * @return array + */ abstract public function list(bool $reveal = false): array; protected function validateName(string $name): void diff --git a/src/Symfony/Bundle/FrameworkBundle/Secrets/DotenvVault.php b/src/Symfony/Bundle/FrameworkBundle/Secrets/DotenvVault.php index 15952611ac1a1..3fab5f4e28525 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Secrets/DotenvVault.php +++ b/src/Symfony/Bundle/FrameworkBundle/Secrets/DotenvVault.php @@ -89,13 +89,13 @@ public function list(bool $reveal = false): array foreach ($_ENV as $k => $v) { if ('' !== ($v ?? '') && preg_match('/^\w+$/D', $k)) { - $secrets[$k] = $reveal ? $v : null; + $secrets[$k] = \is_string($v) && $reveal ? $v : null; } } foreach ($_SERVER as $k => $v) { if ('' !== ($v ?? '') && preg_match('/^\w+$/D', $k)) { - $secrets[$k] = $reveal ? $v : null; + $secrets[$k] = \is_string($v) && $reveal ? $v : null; } } 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/Tests/CacheWarmer/SerializerCacheWarmerTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/SerializerCacheWarmerTest.php index 5feb0c8ec1bd7..9b765c36a18e6 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/SerializerCacheWarmerTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/SerializerCacheWarmerTest.php @@ -30,9 +30,50 @@ public function testWarmUp(array $loaders) @unlink($file); $warmer = new SerializerCacheWarmer($loaders, $file); - $warmer->warmUp(\dirname($file)); + $warmer->warmUp(\dirname($file), \dirname($file)); + + $this->assertFileExists($file); + + $arrayPool = new PhpArrayAdapter($file, new NullAdapter()); + + $this->assertTrue($arrayPool->getItem('Symfony_Bundle_FrameworkBundle_Tests_Fixtures_Serialization_Person')->isHit()); + $this->assertTrue($arrayPool->getItem('Symfony_Bundle_FrameworkBundle_Tests_Fixtures_Serialization_Author')->isHit()); + } + + /** + * @dataProvider loaderProvider + */ + public function testWarmUpAbsoluteFilePath(array $loaders) + { + $file = sys_get_temp_dir().'/0/cache-serializer.php'; + @unlink($file); + + $cacheDir = sys_get_temp_dir().'/1'; + + $warmer = new SerializerCacheWarmer($loaders, $file); + $warmer->warmUp($cacheDir, $cacheDir); $this->assertFileExists($file); + $this->assertFileDoesNotExist($cacheDir.'/cache-serializer.php'); + + $arrayPool = new PhpArrayAdapter($file, new NullAdapter()); + + $this->assertTrue($arrayPool->getItem('Symfony_Bundle_FrameworkBundle_Tests_Fixtures_Serialization_Person')->isHit()); + $this->assertTrue($arrayPool->getItem('Symfony_Bundle_FrameworkBundle_Tests_Fixtures_Serialization_Author')->isHit()); + } + + /** + * @dataProvider loaderProvider + */ + public function testWarmUpWithoutBuildDir(array $loaders) + { + $file = sys_get_temp_dir().'/cache-serializer.php'; + @unlink($file); + + $warmer = new SerializerCacheWarmer($loaders, $file); + $warmer->warmUp(\dirname($file)); + + $this->assertFileDoesNotExist($file); $arrayPool = new PhpArrayAdapter($file, new NullAdapter()); @@ -66,7 +107,7 @@ public function testWarmUpWithoutLoader() @unlink($file); $warmer = new SerializerCacheWarmer([], $file); - $warmer->warmUp(\dirname($file)); + $warmer->warmUp(\dirname($file), \dirname($file)); $this->assertFileExists($file); } @@ -79,7 +120,10 @@ public function testClassAutoloadException() { $this->assertFalse(class_exists($mappedClass = 'AClassThatDoesNotExist_FWB_CacheWarmer_SerializerCacheWarmerTest', false)); - $warmer = new SerializerCacheWarmer([new YamlFileLoader(__DIR__.'/../Fixtures/Serialization/Resources/does_not_exist.yaml')], tempnam(sys_get_temp_dir(), __FUNCTION__)); + $file = tempnam(sys_get_temp_dir(), __FUNCTION__); + @unlink($file); + + $warmer = new SerializerCacheWarmer([new YamlFileLoader(__DIR__.'/../Fixtures/Serialization/Resources/does_not_exist.yaml')], $file); spl_autoload_register($classLoader = function ($class) use ($mappedClass) { if ($class === $mappedClass) { @@ -87,7 +131,8 @@ public function testClassAutoloadException() } }, true, true); - $warmer->warmUp('foo'); + $warmer->warmUp(\dirname($file), \dirname($file)); + $this->assertFileExists($file); spl_autoload_unregister($classLoader); } @@ -98,12 +143,12 @@ public function testClassAutoloadException() */ public function testClassAutoloadExceptionWithUnrelatedException() { - $this->expectException(\DomainException::class); - $this->expectExceptionMessage('This exception should not be caught by the warmer.'); - $this->assertFalse(class_exists($mappedClass = 'AClassThatDoesNotExist_FWB_CacheWarmer_SerializerCacheWarmerTest', false)); - $warmer = new SerializerCacheWarmer([new YamlFileLoader(__DIR__.'/../Fixtures/Serialization/Resources/does_not_exist.yaml')], tempnam(sys_get_temp_dir(), __FUNCTION__)); + $file = tempnam(sys_get_temp_dir(), __FUNCTION__); + @unlink($file); + + $warmer = new SerializerCacheWarmer([new YamlFileLoader(__DIR__.'/../Fixtures/Serialization/Resources/does_not_exist.yaml')], basename($file)); spl_autoload_register($classLoader = function ($class) use ($mappedClass) { if ($class === $mappedClass) { @@ -112,8 +157,17 @@ public function testClassAutoloadExceptionWithUnrelatedException() } }, true, true); - $warmer->warmUp('foo'); + $this->expectException(\DomainException::class); + $this->expectExceptionMessage('This exception should not be caught by the warmer.'); + + try { + $warmer->warmUp(\dirname($file), \dirname($file)); + } catch (\DomainException $e) { + $this->assertFileDoesNotExist($file); - spl_autoload_unregister($classLoader); + throw $e; + } finally { + spl_autoload_unregister($classLoader); + } } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/ValidatorCacheWarmerTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/ValidatorCacheWarmerTest.php index cc471e43fc685..af0bb1b50d3dd 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/ValidatorCacheWarmerTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/CacheWarmer/ValidatorCacheWarmerTest.php @@ -32,7 +32,7 @@ public function testWarmUp() @unlink($file); $warmer = new ValidatorCacheWarmer($validatorBuilder, $file); - $warmer->warmUp(\dirname($file)); + $warmer->warmUp(\dirname($file), \dirname($file)); $this->assertFileExists($file); @@ -42,6 +42,53 @@ public function testWarmUp() $this->assertTrue($arrayPool->getItem('Symfony.Bundle.FrameworkBundle.Tests.Fixtures.Validation.Author')->isHit()); } + public function testWarmUpAbsoluteFilePath() + { + $validatorBuilder = new ValidatorBuilder(); + $validatorBuilder->addXmlMapping(__DIR__.'/../Fixtures/Validation/Resources/person.xml'); + $validatorBuilder->addYamlMapping(__DIR__.'/../Fixtures/Validation/Resources/author.yml'); + $validatorBuilder->addMethodMapping('loadValidatorMetadata'); + $validatorBuilder->enableAttributeMapping(); + + $file = sys_get_temp_dir().'/0/cache-validator.php'; + @unlink($file); + + $cacheDir = sys_get_temp_dir().'/1'; + + $warmer = new ValidatorCacheWarmer($validatorBuilder, $file); + $warmer->warmUp($cacheDir, $cacheDir); + + $this->assertFileExists($file); + $this->assertFileDoesNotExist($cacheDir.'/cache-validator.php'); + + $arrayPool = new PhpArrayAdapter($file, new NullAdapter()); + + $this->assertTrue($arrayPool->getItem('Symfony.Bundle.FrameworkBundle.Tests.Fixtures.Validation.Person')->isHit()); + $this->assertTrue($arrayPool->getItem('Symfony.Bundle.FrameworkBundle.Tests.Fixtures.Validation.Author')->isHit()); + } + + public function testWarmUpWithoutBuilDir() + { + $validatorBuilder = new ValidatorBuilder(); + $validatorBuilder->addXmlMapping(__DIR__.'/../Fixtures/Validation/Resources/person.xml'); + $validatorBuilder->addYamlMapping(__DIR__.'/../Fixtures/Validation/Resources/author.yml'); + $validatorBuilder->addMethodMapping('loadValidatorMetadata'); + $validatorBuilder->enableAttributeMapping(); + + $file = sys_get_temp_dir().'/cache-validator.php'; + @unlink($file); + + $warmer = new ValidatorCacheWarmer($validatorBuilder, $file); + $warmer->warmUp(\dirname($file)); + + $this->assertFileDoesNotExist($file); + + $arrayPool = new PhpArrayAdapter($file, new NullAdapter()); + + $this->assertTrue($arrayPool->getItem('Symfony.Bundle.FrameworkBundle.Tests.Fixtures.Validation.Person')->isHit()); + $this->assertTrue($arrayPool->getItem('Symfony.Bundle.FrameworkBundle.Tests.Fixtures.Validation.Author')->isHit()); + } + public function testWarmUpWithAnnotations() { $validatorBuilder = new ValidatorBuilder(); @@ -52,7 +99,7 @@ public function testWarmUpWithAnnotations() @unlink($file); $warmer = new ValidatorCacheWarmer($validatorBuilder, $file); - $warmer->warmUp(\dirname($file)); + $warmer->warmUp(\dirname($file), \dirname($file)); $this->assertFileExists($file); @@ -72,7 +119,7 @@ public function testWarmUpWithoutLoader() @unlink($file); $warmer = new ValidatorCacheWarmer($validatorBuilder, $file); - $warmer->warmUp(\dirname($file)); + $warmer->warmUp(\dirname($file), \dirname($file)); $this->assertFileExists($file); } @@ -85,9 +132,12 @@ public function testClassAutoloadException() { $this->assertFalse(class_exists($mappedClass = 'AClassThatDoesNotExist_FWB_CacheWarmer_ValidatorCacheWarmerTest', false)); + $file = tempnam(sys_get_temp_dir(), __FUNCTION__); + @unlink($file); + $validatorBuilder = new ValidatorBuilder(); $validatorBuilder->addYamlMapping(__DIR__.'/../Fixtures/Validation/Resources/does_not_exist.yaml'); - $warmer = new ValidatorCacheWarmer($validatorBuilder, tempnam(sys_get_temp_dir(), __FUNCTION__)); + $warmer = new ValidatorCacheWarmer($validatorBuilder, $file); spl_autoload_register($classloader = function ($class) use ($mappedClass) { if ($class === $mappedClass) { @@ -95,7 +145,9 @@ public function testClassAutoloadException() } }, true, true); - $warmer->warmUp('foo'); + $warmer->warmUp(\dirname($file), \dirname($file)); + + $this->assertFileExists($file); spl_autoload_unregister($classloader); } @@ -106,14 +158,14 @@ public function testClassAutoloadException() */ public function testClassAutoloadExceptionWithUnrelatedException() { - $this->expectException(\DomainException::class); - $this->expectExceptionMessage('This exception should not be caught by the warmer.'); + $file = tempnam(sys_get_temp_dir(), __FUNCTION__); + @unlink($file); $this->assertFalse(class_exists($mappedClass = 'AClassThatDoesNotExist_FWB_CacheWarmer_ValidatorCacheWarmerTest', false)); $validatorBuilder = new ValidatorBuilder(); $validatorBuilder->addYamlMapping(__DIR__.'/../Fixtures/Validation/Resources/does_not_exist.yaml'); - $warmer = new ValidatorCacheWarmer($validatorBuilder, tempnam(sys_get_temp_dir(), __FUNCTION__)); + $warmer = new ValidatorCacheWarmer($validatorBuilder, basename($file)); spl_autoload_register($classLoader = function ($class) use ($mappedClass) { if ($class === $mappedClass) { @@ -122,8 +174,17 @@ public function testClassAutoloadExceptionWithUnrelatedException() } }, true, true); - $warmer->warmUp('foo'); + $this->expectException(\DomainException::class); + $this->expectExceptionMessage('This exception should not be caught by the warmer.'); + + try { + $warmer->warmUp(\dirname($file), \dirname($file)); + } catch (\DomainException $e) { + $this->assertFileDoesNotExist($file); - spl_autoload_unregister($classLoader); + throw $e; + } finally { + spl_autoload_unregister($classLoader); + } } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Command/SecretsRevealCommandTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Command/SecretsRevealCommandTest.php index 94643db2c92c5..d77d303d5c88b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Command/SecretsRevealCommandTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Command/SecretsRevealCommandTest.php @@ -46,6 +46,19 @@ public function testInvalidName() $this->assertStringContainsString('The secret "undefinedKey" does not exist.', trim($tester->getDisplay(true))); } + public function testFailedDecrypt() + { + $vault = $this->createMock(AbstractVault::class); + $vault->method('list')->willReturn(['secretKey' => null]); + + $command = new SecretsRevealCommand($vault); + + $tester = new CommandTester($command); + $this->assertSame(Command::INVALID, $tester->execute(['name' => 'secretKey'])); + + $this->assertStringContainsString('The secret "secretKey" could not be decrypted.', trim($tester->getDisplay(true))); + } + /** * @backupGlobals enabled */ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/Workflow/Validator/DefinitionValidator.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/Workflow/Validator/DefinitionValidator.php new file mode 100644 index 0000000000000..7244e927ca763 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/Workflow/Validator/DefinitionValidator.php @@ -0,0 +1,16 @@ +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/php/messenger_multiple_buses_without_deduplicate_middleware.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_without_deduplicate_middleware.php index b8e7530bb3e01..fd4a008341cb4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_without_deduplicate_middleware.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_without_deduplicate_middleware.php @@ -5,6 +5,7 @@ 'http_method_override' => false, 'handle_all_throwables' => true, 'php_errors' => ['log' => true], + 'lock' => false, 'messenger' => [ 'default_bus' => 'messenger.bus.commands', 'buses' => [ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/workflows.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/workflows.php index 118a627c7c05b..2c29b848901eb 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/workflows.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/workflows.php @@ -13,6 +13,9 @@ 'supports' => [ FrameworkExtensionTestCase::class, ], + 'definition_validators' => [ + Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Fixtures\Workflow\Validator\DefinitionValidator::class, + ], 'initial_marking' => ['draft'], 'metadata' => [ 'title' => 'article workflow', 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/xml/messenger_multiple_buses_without_deduplicate_middleware.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_without_deduplicate_middleware.xml index dcf402e1a36ec..3f0d96249959e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_without_deduplicate_middleware.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_without_deduplicate_middleware.xml @@ -8,6 +8,7 @@ + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/workflows.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/workflows.xml index 76b4f07a87a44..c5dae479d3d63 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/workflows.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/workflows.xml @@ -13,6 +13,7 @@ draft Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTestCase + Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Fixtures\Workflow\Validator\DefinitionValidator 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/Fixtures/yml/messenger_multiple_buses_without_deduplicate_middleware.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_without_deduplicate_middleware.yml index f06d534a55ec2..38fca57379fcb 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_without_deduplicate_middleware.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_without_deduplicate_middleware.yml @@ -4,6 +4,7 @@ framework: handle_all_throwables: true php_errors: log: true + lock: false messenger: default_bus: messenger.bus.commands buses: diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/workflows.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/workflows.yml index a9b427d89408a..cac5f6f230f92 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/workflows.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/workflows.yml @@ -9,6 +9,8 @@ framework: type: workflow supports: - Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTestCase + definition_validators: + - Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Fixtures\Workflow\Validator\DefinitionValidator initial_marking: [draft] metadata: title: article workflow diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php index d942c122c826a..5ef658693d1a3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php @@ -15,6 +15,7 @@ use Psr\Log\LoggerAwareInterface; use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension; use Symfony\Bundle\FrameworkBundle\FrameworkBundle; +use Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Fixtures\Workflow\Validator\DefinitionValidator; use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage; use Symfony\Bundle\FrameworkBundle\Tests\TestCase; use Symfony\Bundle\FullStack; @@ -91,6 +92,7 @@ use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Component\Webhook\Client\RequestParser; use Symfony\Component\Webhook\Controller\WebhookController; +use Symfony\Component\Workflow\DependencyInjection\WorkflowValidatorPass; use Symfony\Component\Workflow\Exception\InvalidDefinitionException; use Symfony\Component\Workflow\Metadata\InMemoryMetadataStore; use Symfony\Component\Workflow\WorkflowEvents; @@ -287,7 +289,11 @@ public function testProfilerCollectSerializerDataEnabled() public function testWorkflows() { - $container = $this->createContainerFromFile('workflows'); + DefinitionValidator::$called = false; + + $container = $this->createContainerFromFile('workflows', compile: false); + $container->addCompilerPass(new WorkflowValidatorPass()); + $container->compile(); $this->assertTrue($container->hasDefinition('workflow.article'), 'Workflow is registered as a service'); $this->assertSame('workflow.abstract', $container->getDefinition('workflow.article')->getParent()); @@ -310,6 +316,7 @@ public function testWorkflows() ], $tags['workflow'][0]['metadata'] ?? null); $this->assertTrue($container->hasDefinition('workflow.article.definition'), 'Workflow definition is registered as a service'); + $this->assertTrue(DefinitionValidator::$called, 'DefinitionValidator is called'); $workflowDefinition = $container->getDefinition('workflow.article.definition'); @@ -403,7 +410,9 @@ public function testWorkflowAreValidated() { $this->expectException(InvalidDefinitionException::class); $this->expectExceptionMessage('A transition from a place/state must have an unique name. Multiple transitions named "go" from place/state "first" were found on StateMachine "my_workflow".'); - $this->createContainerFromFile('workflow_not_valid'); + $container = $this->createContainerFromFile('workflow_not_valid', compile: false); + $container->addCompilerPass(new WorkflowValidatorPass()); + $container->compile(); } public function testWorkflowCannotHaveBothSupportsAndSupportStrategy() @@ -1482,6 +1491,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', [ @@ -2591,6 +2611,14 @@ public function testJsonStreamerEnabled() $this->assertTrue($container->has('json_streamer.stream_writer')); } + public function testObjectMapperEnabled() + { + $container = $this->createContainerFromClosure(function (ContainerBuilder $container) { + $container->loadFromExtension('framework', []); + }); + $this->assertTrue($container->has('object_mapper')); + } + protected function createContainer(array $data = []) { return new ContainerBuilder(new EnvPlaceholderParameterBag(array_merge([ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php index deac159b6f9b0..f69a53932711c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php @@ -17,7 +17,13 @@ use Symfony\Component\DependencyInjection\Exception\LogicException; use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException; use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; +use Symfony\Component\RateLimiter\CompoundRateLimiterFactory; +use Symfony\Component\RateLimiter\RateLimiterFactoryInterface; +use Symfony\Component\Validator\Constraints\Email; +use Symfony\Component\Workflow\Definition; +use Symfony\Component\Workflow\DependencyInjection\WorkflowValidatorPass; use Symfony\Component\Workflow\Exception\InvalidDefinitionException; +use Symfony\Component\Workflow\Validator\DefinitionValidatorInterface; class PhpFrameworkExtensionTest extends FrameworkExtensionTestCase { @@ -99,7 +105,7 @@ public function testWorkflowValidationStateMachine() { $this->expectException(InvalidDefinitionException::class); $this->expectExceptionMessage('A transition from a place/state must have an unique name. Multiple transitions named "a_to_b" from place/state "a" were found on StateMachine "article".'); - $this->createContainerFromClosure(function ($container) { + $this->createContainerFromClosure(function (ContainerBuilder $container) { $container->loadFromExtension('framework', [ 'annotations' => false, 'http_method_override' => false, @@ -125,9 +131,57 @@ public function testWorkflowValidationStateMachine() ], ], ]); + $container->addCompilerPass(new WorkflowValidatorPass()); }); } + /** + * @dataProvider provideWorkflowValidationCustomTests + */ + public function testWorkflowValidationCustomBroken(string $class, string $message) + { + $this->expectException(InvalidConfigurationException::class); + $this->expectExceptionMessage($message); + $this->createContainerFromClosure(function ($container) use ($class) { + $container->loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'workflows' => [ + 'article' => [ + 'type' => 'state_machine', + 'supports' => [ + __CLASS__, + ], + 'places' => [ + 'a', + 'b', + ], + 'transitions' => [ + 'a_to_b' => [ + 'from' => ['a'], + 'to' => ['b'], + ], + ], + 'definition_validators' => [ + $class, + ], + ], + ], + ]); + }); + } + + public static function provideWorkflowValidationCustomTests() + { + yield ['classDoesNotExist', 'Invalid configuration for path "framework.workflows.workflows.article.definition_validators.0": The validation class "classDoesNotExist" does not exist.']; + + yield [\DateTime::class, 'Invalid configuration for path "framework.workflows.workflows.article.definition_validators.0": The validation class "DateTime" is not an instance of "Symfony\Component\Workflow\Validator\DefinitionValidatorInterface".']; + + yield [WorkflowValidatorWithConstructor::class, 'Invalid configuration for path "framework.workflows.workflows.article.definition_validators.0": The "Symfony\\\\Bundle\\\\FrameworkBundle\\\\Tests\\\\DependencyInjection\\\\WorkflowValidatorWithConstructor" validation class constructor must not have any arguments.']; + } + public function testWorkflowDefaultMarkingStoreDefinition() { $container = $this->createContainerFromClosure(function ($container) { @@ -188,7 +242,7 @@ public function testWorkflowDefaultMarkingStoreDefinition() $this->assertNull($argumentsB['index_1'], 'workflow_b marking_store argument is null'); } - public function testRateLimiterWithLockFactory() + public function testRateLimiterLockFactoryWithLockDisabled() { try { $this->createContainerFromClosure(function (ContainerBuilder $container) { @@ -199,7 +253,7 @@ public function testRateLimiterWithLockFactory() 'php_errors' => ['log' => true], 'lock' => false, 'rate_limiter' => [ - 'with_lock' => ['policy' => 'fixed_window', 'limit' => 10, 'interval' => '1 hour'], + 'with_lock' => ['policy' => 'fixed_window', 'limit' => 10, 'interval' => '1 hour', 'lock_factory' => 'lock.factory'], ], ]); }); @@ -208,7 +262,10 @@ public function testRateLimiterWithLockFactory() } catch (LogicException $e) { $this->assertEquals('Rate limiter "with_lock" requires the Lock component to be configured.', $e->getMessage()); } + } + public function testRateLimiterAutoLockFactoryWithLockEnabled() + { $container = $this->createContainerFromClosure(function (ContainerBuilder $container) { $container->loadFromExtension('framework', [ 'annotations' => false, @@ -226,13 +283,35 @@ public function testRateLimiterWithLockFactory() $this->assertEquals('lock.factory', (string) $withLock->getArgument(2)); } - public function testRateLimiterLockFactory() + public function testRateLimiterAutoLockFactoryWithLockDisabled() { $container = $this->createContainerFromClosure(function (ContainerBuilder $container) { $container->loadFromExtension('framework', [ 'annotations' => false, 'http_method_override' => false, 'handle_all_throwables' => true, + 'lock' => false, + 'php_errors' => ['log' => true], + 'rate_limiter' => [ + 'without_lock' => ['policy' => 'fixed_window', 'limit' => 10, 'interval' => '1 hour'], + ], + ]); + }); + + $this->expectException(OutOfBoundsException::class); + $this->expectExceptionMessageMatches('/^The argument "2" doesn\'t exist.*\.$/'); + + $container->getDefinition('limiter.without_lock')->getArgument(2); + } + + public function testRateLimiterDisableLockFactory() + { + $container = $this->createContainerFromClosure(function (ContainerBuilder $container) { + $container->loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'lock' => true, 'php_errors' => ['log' => true], 'rate_limiter' => [ 'without_lock' => ['policy' => 'fixed_window', 'limit' => 10, 'interval' => '1 hour', 'lock_factory' => null], @@ -265,4 +344,128 @@ 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']); } + + public function testRateLimiterCompoundPolicy() + { + if (!class_exists(CompoundRateLimiterFactory::class)) { + $this->markTestSkipped('CompoundRateLimiterFactory is not available.'); + } + + $container = $this->createContainerFromClosure(function (ContainerBuilder $container) { + $container->loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'lock' => true, + 'rate_limiter' => [ + 'first' => ['policy' => 'fixed_window', 'limit' => 10, 'interval' => '1 hour'], + 'second' => ['policy' => 'sliding_window', 'limit' => 10, 'interval' => '1 hour'], + 'compound' => ['policy' => 'compound', 'limiters' => ['first', 'second']], + ], + ]); + }); + + $this->assertSame([ + 'policy' => 'fixed_window', + 'limit' => 10, + 'interval' => '1 hour', + 'id' => 'first', + ], $container->getDefinition('limiter.first')->getArgument(0)); + $this->assertSame([ + 'policy' => 'sliding_window', + 'limit' => 10, + 'interval' => '1 hour', + 'id' => 'second', + ], $container->getDefinition('limiter.second')->getArgument(0)); + + $definition = $container->getDefinition('limiter.compound'); + $this->assertSame(CompoundRateLimiterFactory::class, $definition->getClass()); + $this->assertEquals( + [ + 'limiter.first', + 'limiter.second', + ], + $definition->getArgument(0)->getValues() + ); + $this->assertSame('limiter.compound', (string) $container->getAlias(RateLimiterFactoryInterface::class.' $compoundLimiter')); + } + + public function testRateLimiterCompoundPolicyNoLimiters() + { + if (!class_exists(CompoundRateLimiterFactory::class)) { + $this->markTestSkipped('CompoundRateLimiterFactory is not available.'); + } + + $this->expectException(\LogicException::class); + $this->createContainerFromClosure(function ($container) { + $container->loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'rate_limiter' => [ + 'compound' => ['policy' => 'compound'], + ], + ]); + }); + } + + public function testRateLimiterCompoundPolicyInvalidLimiters() + { + if (!class_exists(CompoundRateLimiterFactory::class)) { + $this->markTestSkipped('CompoundRateLimiterFactory is not available.'); + } + + $this->expectException(\LogicException::class); + $this->createContainerFromClosure(function ($container) { + $container->loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'rate_limiter' => [ + 'compound' => ['policy' => 'compound', 'limiters' => ['invalid1', 'invalid2']], + ], + ]); + }); + } + + /** + * @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]; + } + } +} + +class WorkflowValidatorWithConstructor implements DefinitionValidatorInterface +{ + public function __construct(bool $enabled) + { + } + + public function validate(Definition $definition, string $name): void + { + } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/ObjectMapper/TransformCallable.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/ObjectMapper/TransformCallable.php index da4f26a2dd4e6..3321e28d1ac67 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/ObjectMapper/TransformCallable.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/ObjectMapper/TransformCallable.php @@ -18,7 +18,7 @@ */ final class TransformCallable implements TransformCallableInterface { - public function __invoke(mixed $value, object $object): mixed + public function __invoke(mixed $value, object $source, ?object $target): mixed { return 'transformed'; } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php index 8d3f15ba61680..d21d4d113d2e6 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); 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 2ecedbc45660e..15a9496d11067 100644 --- a/src/Symfony/Bundle/FrameworkBundle/composer.json +++ b/src/Symfony/Bundle/FrameworkBundle/composer.json @@ -54,7 +54,7 @@ "symfony/messenger": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", "symfony/notifier": "^6.4|^7.0", - "symfony/object-mapper": "^7.3", + "symfony/object-mapper": "^v7.3.0-beta2", "symfony/process": "^6.4|^7.0", "symfony/rate-limiter": "^6.4|^7.0", "symfony/scheduler": "^6.4.4|^7.0.4", @@ -67,7 +67,7 @@ "symfony/twig-bundle": "^6.4|^7.0", "symfony/type-info": "^7.1", "symfony/validator": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", + "symfony/workflow": "^7.3", "symfony/yaml": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", "symfony/json-streamer": "7.3.*", @@ -94,6 +94,7 @@ "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", "symfony/mime": "<6.4", + "symfony/object-mapper": ">=7.4", "symfony/property-info": "<6.4", "symfony/property-access": "<6.4", "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", @@ -108,7 +109,7 @@ "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", "symfony/webhook": "<7.2", - "symfony/workflow": "<6.4" + "symfony/workflow": "<7.3.0-beta2" }, "autoload": { "psr-4": { "Symfony\\Bundle\\FrameworkBundle\\": "" }, diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php index 9854a1f047a7a..0a2d32c9f3f4d 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php @@ -55,9 +55,14 @@ public function getConfigTreeBuilder(): TreeBuilder $rootNode = $tb->getRootNode(); $rootNode + ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/security.html', 'symfony/security-bundle') ->beforeNormalization() ->always() ->then(function ($v) { + if (isset($v['hide_user_not_found']) && isset($v['expose_security_errors'])) { + throw new InvalidConfigurationException('You cannot use both "hide_user_not_found" and "expose_security_errors" at the same time.'); + } + if (isset($v['hide_user_not_found']) && !isset($v['expose_security_errors'])) { $v['expose_security_errors'] = $v['hide_user_not_found'] ? ExposeSecurityLevel::None : ExposeSecurityLevel::All; } @@ -75,7 +80,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->setDeprecated('symfony/security-bundle', '7.3', 'The "%node%" option is deprecated and will be removed in 8.0. Use the "expose_security_errors" option instead.') ->end() ->enumNode('expose_security_errors') - ->beforeNormalization()->ifString()->then(fn ($v) => ['value' => ExposeSecurityLevel::tryFrom($v)])->end() + ->beforeNormalization()->ifString()->then(fn ($v) => ExposeSecurityLevel::tryFrom($v))->end() ->values(ExposeSecurityLevel::cases()) ->defaultValue(ExposeSecurityLevel::None) ->end() diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index dd1b8cdb490cc..1711964b3472f 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; @@ -62,7 +63,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. @@ -93,7 +93,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); } @@ -321,7 +321,7 @@ private function createFirewalls(array $config, ContainerBuilder $container): vo $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 @@ -683,7 +683,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/Security.php b/src/Symfony/Bundle/SecurityBundle/Security.php index 7f311f68d7d2b..2efbb67fc3de0 100644 --- a/src/Symfony/Bundle/SecurityBundle/Security.php +++ b/src/Symfony/Bundle/SecurityBundle/Security.php @@ -171,8 +171,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/MainConfigurationTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/MainConfigurationTest.php index 6479e56a668e7..6904a21b18113 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/MainConfigurationTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/MainConfigurationTest.php @@ -254,6 +254,9 @@ public static function provideHideUserNotFoundData(): iterable yield [['expose_security_errors' => ExposeSecurityLevel::None], ExposeSecurityLevel::None]; yield [['expose_security_errors' => ExposeSecurityLevel::AccountStatus], ExposeSecurityLevel::AccountStatus]; yield [['expose_security_errors' => ExposeSecurityLevel::All], ExposeSecurityLevel::All]; + yield [['expose_security_errors' => 'none'], ExposeSecurityLevel::None]; + yield [['expose_security_errors' => 'account_status'], ExposeSecurityLevel::AccountStatus]; + yield [['expose_security_errors' => 'all'], ExposeSecurityLevel::All]; } /** @@ -280,4 +283,18 @@ public static function provideHideUserNotFoundLegacyData(): iterable yield [['hide_user_not_found' => true], ExposeSecurityLevel::None, true]; yield [['hide_user_not_found' => false], ExposeSecurityLevel::All, false]; } + + public function testCannotUseHideUserNotFoundAndExposeSecurityErrorsAtTheSameTime() + { + $processor = new Processor(); + $configuration = new MainConfiguration([], []); + + $this->expectException(InvalidConfigurationException::class); + $this->expectExceptionMessage('You cannot use both "hide_user_not_found" and "expose_security_errors" at the same time.'); + + $processor->processConfiguration($configuration, [static::$minimalConfig + [ + 'hide_user_not_found' => true, + 'expose_security_errors' => ExposeSecurityLevel::None, + ]]); + } } diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/AccessTokenTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/AccessTokenTest.php index 0be67a56f55c9..75adf296110da 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/AccessTokenTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/AccessTokenTest.php @@ -353,9 +353,17 @@ public function testCustomUserLoader() /** * @dataProvider validAccessTokens + * + * @requires extension openssl */ - public function testOidcSuccess(string $token) + public function testOidcSuccess(callable $tokenFactory) { + try { + $token = $tokenFactory(); + } catch (\RuntimeException $e) { + $this->markTestSkipped($e->getMessage()); + } + $client = $this->createClient(['test_case' => 'AccessToken', 'root_config' => 'config_oidc.yml']); $client->request('GET', '/foo', [], [], ['HTTP_AUTHORIZATION' => \sprintf('Bearer %s', $token)]); $response = $client->getResponse(); @@ -367,9 +375,17 @@ public function testOidcSuccess(string $token) /** * @dataProvider invalidAccessTokens + * + * @requires extension openssl */ - public function testOidcFailure(string $token) + public function testOidcFailure(callable $tokenFactory) { + try { + $token = $tokenFactory(); + } catch (\RuntimeException $e) { + $this->markTestSkipped($e->getMessage()); + } + $client = $this->createClient(['test_case' => 'AccessToken', 'root_config' => 'config_oidc.yml']); $client->request('GET', '/foo', [], [], ['HTTP_AUTHORIZATION' => \sprintf('Bearer %s', $token)]); $response = $client->getResponse(); @@ -440,12 +456,10 @@ public static function validAccessTokens(): array 'sub' => 'e21bf182-1538-406e-8ccb-e25a17aba39f', 'username' => 'dunglas', ]; - $jws = self::createJws($claims); - $jwe = self::createJwe($jws); return [ - [$jws], - [$jwe], + [fn () => self::createJws($claims)], + [fn () => self::createJwe(self::createJws($claims))], ]; } @@ -466,14 +480,14 @@ public static function invalidAccessTokens(): array ]; return [ - [self::createJws([...$claims, 'aud' => 'Invalid Audience'])], - [self::createJws([...$claims, 'iss' => 'Invalid Issuer'])], - [self::createJws([...$claims, 'exp' => $time - 3600])], - [self::createJws([...$claims, 'nbf' => $time + 3600])], - [self::createJws([...$claims, 'iat' => $time + 3600])], - [self::createJws([...$claims, 'username' => 'Invalid Username'])], - [self::createJwe(self::createJws($claims), ['exp' => $time - 3600])], - [self::createJwe(self::createJws($claims), ['cty' => 'x-specific'])], + [fn () => self::createJws([...$claims, 'aud' => 'Invalid Audience'])], + [fn () => self::createJws([...$claims, 'iss' => 'Invalid Issuer'])], + [fn () => self::createJws([...$claims, 'exp' => $time - 3600])], + [fn () => self::createJws([...$claims, 'nbf' => $time + 3600])], + [fn () => self::createJws([...$claims, 'iat' => $time + 3600])], + [fn () => self::createJws([...$claims, 'username' => 'Invalid Username'])], + [fn () => self::createJwe(self::createJws($claims), ['exp' => $time - 3600])], + [fn () => self::createJwe(self::createJws($claims), ['cty' => 'x-specific'])], ]; } 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/SecurityBundle/composer.json b/src/Symfony/Bundle/SecurityBundle/composer.json index fa5cb52ff04b5..7459b0175b95f 100644 --- a/src/Symfony/Bundle/SecurityBundle/composer.json +++ b/src/Symfony/Bundle/SecurityBundle/composer.json @@ -20,7 +20,7 @@ "composer-runtime-api": ">=2.1", "ext-xml": "*", "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4.11|^7.1.4", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", diff --git a/src/Symfony/Bundle/TwigBundle/CHANGELOG.md b/src/Symfony/Bundle/TwigBundle/CHANGELOG.md index 32a1c9aef64e5..40d5be350afe7 100644 --- a/src/Symfony/Bundle/TwigBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/TwigBundle/CHANGELOG.md @@ -7,6 +7,8 @@ CHANGELOG * Enable `#[AsTwigFilter]`, `#[AsTwigFunction]` and `#[AsTwigTest]` attributes to configure extensions on runtime classes * Add support for a `twig` validator + * Use `ChainCache` to store warmed-up cache in `kernel.build_dir` and runtime cache in `kernel.cache_dir` + * Make `TemplateCacheWarmer` use `kernel.build_dir` instead of `kernel.cache_dir` 7.1 --- diff --git a/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheWarmer.php b/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheWarmer.php index 868dc076cfd9e..3bb89760f3a6f 100644 --- a/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheWarmer.php +++ b/src/Symfony/Bundle/TwigBundle/CacheWarmer/TemplateCacheWarmer.php @@ -14,6 +14,8 @@ use Psr\Container\ContainerInterface; use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface; use Symfony\Contracts\Service\ServiceSubscriberInterface; +use Twig\Cache\CacheInterface; +use Twig\Cache\NullCache; use Twig\Environment; use Twig\Error\Error; @@ -34,6 +36,7 @@ class TemplateCacheWarmer implements CacheWarmerInterface, ServiceSubscriberInte public function __construct( private ContainerInterface $container, private iterable $iterator, + private ?CacheInterface $cache = null, ) { } @@ -41,19 +44,40 @@ public function warmUp(string $cacheDir, ?string $buildDir = null): array { $this->twig ??= $this->container->get('twig'); - foreach ($this->iterator as $template) { - try { - $this->twig->load($template); - } catch (Error) { + $originalCache = $this->twig->getCache(); + if ($originalCache instanceof NullCache) { + // There's no point to warm up a cache that won't be used afterward + return []; + } + + if (null !== $this->cache) { + if (!$buildDir) { /* - * Problem during compilation, give up for this template (e.g. syntax errors). - * Failing silently here allows to ignore templates that rely on functions that aren't available in - * the current environment. For example, the WebProfilerBundle shouldn't be available in the prod - * environment, but some templates that are never used in prod might rely on functions the bundle provides. - * As we can't detect which templates are "really" important, we try to load all of them and ignore - * errors. Error checks may be performed by calling the lint:twig command. + * The cache has already been warmup during the build of the container, when $buildDir was set. */ + return []; + } + // Swap the cache for the warmup as the Twig Environment has the ChainCache injected + $this->twig->setCache($this->cache); + } + + try { + foreach ($this->iterator as $template) { + try { + $this->twig->load($template); + } catch (Error) { + /* + * Problem during compilation, give up for this template (e.g. syntax errors). + * Failing silently here allows to ignore templates that rely on functions that aren't available in + * the current environment. For example, the WebProfilerBundle shouldn't be available in the prod + * environment, but some templates that are never used in prod might rely on functions the bundle provides. + * As we can't detect which templates are "really" important, we try to load all of them and ignore + * errors. Error checks may be performed by calling the lint:twig command. + */ + } } + } finally { + $this->twig->setCache($originalCache); } return []; diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/AttributeExtensionPass.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/AttributeExtensionPass.php index 24f760802bc94..354874866a0ae 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/AttributeExtensionPass.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/AttributeExtensionPass.php @@ -14,10 +14,13 @@ use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\LogicException; use Twig\Attribute\AsTwigFilter; use Twig\Attribute\AsTwigFunction; use Twig\Attribute\AsTwigTest; +use Twig\Extension\AbstractExtension; use Twig\Extension\AttributeExtension; +use Twig\Extension\ExtensionInterface; /** * Register an instance of AttributeExtension for each service using the @@ -33,6 +36,14 @@ final class AttributeExtensionPass implements CompilerPassInterface public static function autoconfigureFromAttribute(ChildDefinition $definition, AsTwigFilter|AsTwigFunction|AsTwigTest $attribute, \ReflectionMethod $reflector): void { + $class = $reflector->getDeclaringClass(); + if ($class->implementsInterface(ExtensionInterface::class)) { + if ($class->isSubclassOf(AbstractExtension::class)) { + throw new LogicException(\sprintf('The class "%s" cannot extend "%s" and use the "#[%s]" attribute on method "%s()", choose one or the other.', $class->name, AbstractExtension::class, $attribute::class, $reflector->name)); + } + throw new LogicException(\sprintf('The class "%s" cannot implement "%s" and use the "#[%s]" attribute on method "%s()", choose one or the other.', $class->name, ExtensionInterface::class, $attribute::class, $reflector->name)); + } + $definition->addTag(self::TAG); // The service must be tagged as a runtime to call non-static methods diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php index 32a4bb318fea4..354e1a4e85a0a 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php @@ -32,7 +32,9 @@ public function getConfigTreeBuilder(): TreeBuilder $treeBuilder = new TreeBuilder('twig'); $rootNode = $treeBuilder->getRootNode(); - $rootNode->beforeNormalization() + $rootNode + ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/twig.html', 'symfony/twig-bundle') + ->beforeNormalization() ->ifTrue(fn ($v) => \is_array($v) && \array_key_exists('exception_controller', $v)) ->then(function ($v) { if (isset($v['exception_controller'])) { @@ -134,7 +136,7 @@ private function addTwigOptions(ArrayNodeDefinition $rootNode): void ->example('Twig\Template') ->cannotBeEmpty() ->end() - ->scalarNode('cache')->defaultValue('%kernel.cache_dir%/twig')->end() + ->scalarNode('cache')->defaultTrue()->end() ->scalarNode('charset')->defaultValue('%kernel.charset%')->end() ->booleanNode('debug')->defaultValue('%kernel.debug%')->end() ->booleanNode('strict_variables')->defaultValue('%kernel.debug%')->end() diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index db508873387b2..418172956391b 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -30,6 +30,7 @@ use Twig\Attribute\AsTwigFilter; use Twig\Attribute\AsTwigFunction; use Twig\Attribute\AsTwigTest; +use Twig\Cache\FilesystemCache; use Twig\Environment; use Twig\Extension\ExtensionInterface; use Twig\Extension\RuntimeExtensionInterface; @@ -167,6 +168,31 @@ public function load(array $configs, ContainerBuilder $container): void } } + if (true === $config['cache']) { + $autoReloadOrDefault = $container->getParameterBag()->resolveValue($config['auto_reload'] ?? $config['debug']); + $buildDir = $container->getParameter('kernel.build_dir'); + $cacheDir = $container->getParameter('kernel.cache_dir'); + + if ($autoReloadOrDefault || $cacheDir === $buildDir) { + $config['cache'] = '%kernel.cache_dir%/twig'; + } + } + + if (true === $config['cache']) { + $config['cache'] = new Reference('twig.template_cache.chain'); + } else { + $container->removeDefinition('twig.template_cache.chain'); + $container->removeDefinition('twig.template_cache.runtime_cache'); + $container->removeDefinition('twig.template_cache.readonly_cache'); + $container->removeDefinition('twig.template_cache.warmup_cache'); + + if (false === $config['cache']) { + $container->removeDefinition('twig.template_cache_warmer'); + } else { + $container->getDefinition('twig.template_cache_warmer')->replaceArgument(2, null); + } + } + if (isset($config['autoescape_service'])) { $config['autoescape'] = [new Reference($config['autoescape_service']), $config['autoescape_service_method'] ?? '__invoke']; } else { @@ -191,10 +217,6 @@ public function load(array $configs, ContainerBuilder $container): void $container->registerAttributeForAutoconfiguration(AsTwigFilter::class, AttributeExtensionPass::autoconfigureFromAttribute(...)); $container->registerAttributeForAutoconfiguration(AsTwigFunction::class, AttributeExtensionPass::autoconfigureFromAttribute(...)); $container->registerAttributeForAutoconfiguration(AsTwigTest::class, AttributeExtensionPass::autoconfigureFromAttribute(...)); - - if (false === $config['cache']) { - $container->removeDefinition('twig.template_cache_warmer'); - } } private function getBundleTemplatePaths(ContainerBuilder $container, array $config): array diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.php b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.php index 02631d28c39a4..812ac1f666978 100644 --- a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.php +++ b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.php @@ -36,7 +36,9 @@ use Symfony\Bundle\TwigBundle\CacheWarmer\TemplateCacheWarmer; use Symfony\Bundle\TwigBundle\DependencyInjection\Configurator\EnvironmentConfigurator; use Symfony\Bundle\TwigBundle\TemplateIterator; +use Twig\Cache\ChainCache; use Twig\Cache\FilesystemCache; +use Twig\Cache\ReadOnlyFilesystemCache; use Twig\Environment; use Twig\Extension\CoreExtension; use Twig\Extension\DebugExtension; @@ -79,8 +81,24 @@ ->set('twig.template_iterator', TemplateIterator::class) ->args([service('kernel'), abstract_arg('Twig paths'), param('twig.default_path'), abstract_arg('File name pattern')]) + ->set('twig.template_cache.runtime_cache', FilesystemCache::class) + ->args([param('kernel.cache_dir').'/twig']) + + ->set('twig.template_cache.readonly_cache', ReadOnlyFilesystemCache::class) + ->args([param('kernel.build_dir').'/twig']) + + ->set('twig.template_cache.warmup_cache', FilesystemCache::class) + ->args([param('kernel.build_dir').'/twig']) + + ->set('twig.template_cache.chain', ChainCache::class) + ->args([[service('twig.template_cache.readonly_cache'), service('twig.template_cache.runtime_cache')]]) + ->set('twig.template_cache_warmer', TemplateCacheWarmer::class) - ->args([service(ContainerInterface::class), service('twig.template_iterator')]) + ->args([ + service(ContainerInterface::class), + service('twig.template_iterator'), + service('twig.template_cache.warmup_cache'), + ]) ->tag('kernel.cache_warmer') ->tag('container.service_subscriber', ['id' => 'twig']) diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/full.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/full.php index f87af5a1baba4..68c7f5a304218 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/full.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/full.php @@ -10,8 +10,7 @@ 'pi' => 3.14, 'bad' => ['key' => 'foo'], ], - 'auto_reload' => true, - 'cache' => '/tmp', + 'auto_reload' => false, 'charset' => 'ISO-8859-1', 'debug' => true, 'strict_variables' => true, diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/no-cache.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/no-cache.php new file mode 100644 index 0000000000000..df1ae5c6bd63b --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/no-cache.php @@ -0,0 +1,5 @@ +loadFromExtension('twig', [ + 'cache' => false, +]); diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/path-cache.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/path-cache.php new file mode 100644 index 0000000000000..f0701a57d8c88 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/path-cache.php @@ -0,0 +1,5 @@ +loadFromExtension('twig', [ + 'cache' => 'random-path', +]); diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/prod-cache.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/prod-cache.php new file mode 100644 index 0000000000000..628854601a960 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/php/prod-cache.php @@ -0,0 +1,6 @@ +loadFromExtension('twig', [ + 'cache' => true, + 'auto_reload' => false, +]); diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/extra.xml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/extra.xml index f1cf8985329d0..df02c9dc05f91 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/extra.xml +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/extra.xml @@ -6,7 +6,7 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/twig https://symfony.com/schema/dic/twig/twig-1.0.xsd"> - + namespaced_path3 diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/full.xml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/full.xml index 528a466b0452c..3349e0d5fa744 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/full.xml +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/full.xml @@ -6,7 +6,7 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/twig https://symfony.com/schema/dic/twig/twig-1.0.xsd"> - + MyBundle::form.html.twig @@qux diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/no-cache.xml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/no-cache.xml new file mode 100644 index 0000000000000..f6fa72c747893 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/no-cache.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/path-cache.xml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/path-cache.xml new file mode 100644 index 0000000000000..9caf2fc0452b0 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/path-cache.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/prod-cache.xml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/prod-cache.xml new file mode 100644 index 0000000000000..6ee9f38506252 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/xml/prod-cache.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/full.yml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/full.yml index 6c249d378ff22..ab19cbf0bff8f 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/full.yml +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/full.yml @@ -6,8 +6,7 @@ twig: baz: "@@qux" pi: 3.14 bad: {key: foo} - auto_reload: true - cache: /tmp + auto_reload: false charset: ISO-8859-1 debug: true strict_variables: true diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/no-cache.yml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/no-cache.yml new file mode 100644 index 0000000000000..c1e9f184bd336 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/no-cache.yml @@ -0,0 +1,2 @@ +twig: + cache: false diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/path-cache.yml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/path-cache.yml new file mode 100644 index 0000000000000..04e9d1dc61b06 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/path-cache.yml @@ -0,0 +1,2 @@ +twig: + cache: random-path diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/prod-cache.yml b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/prod-cache.yml new file mode 100644 index 0000000000000..82a1dd9e100d3 --- /dev/null +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/Fixtures/yml/prod-cache.yml @@ -0,0 +1,3 @@ +twig: + cache: true + auto_reload: false diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php index ffe772a28861d..086a4cdd6e1e8 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php @@ -28,6 +28,7 @@ use Symfony\Component\Form\FormRenderer; use Symfony\Component\Mailer\Mailer; use Symfony\Component\Stopwatch\Stopwatch; +use Symfony\Component\Validator\Validator\ValidatorInterface; use Twig\Environment; class TwigExtensionTest extends TestCase @@ -54,14 +55,20 @@ public function testLoadEmptyConfiguration() if (class_exists(Mailer::class)) { $this->assertCount(2, $container->getDefinition('twig.mime_body_renderer')->getArguments()); } + + if (interface_exists(ValidatorInterface::class)) { + $this->assertTrue($container->hasDefinition('twig.validator')); + } else { + $this->assertFalse($container->hasDefinition('twig.validator')); + } } /** - * @dataProvider getFormats + * @dataProvider getFormatsAndBuildDir */ - public function testLoadFullConfiguration(string $format) + public function testLoadFullConfiguration(string $format, ?string $buildDir) { - $container = $this->createContainer(); + $container = $this->createContainer($buildDir); $container->registerExtension(new TwigExtension()); $this->loadFromFile($container, 'full', $format); $this->compileContainer($container); @@ -92,13 +99,64 @@ public function testLoadFullConfiguration(string $format) // Twig options $options = $container->getDefinition('twig')->getArgument(1); - $this->assertTrue($options['auto_reload'], '->load() sets the auto_reload option'); + $this->assertFalse($options['auto_reload'], '->load() sets the auto_reload option'); $this->assertSame('name', $options['autoescape'], '->load() sets the autoescape option'); $this->assertArrayNotHasKey('base_template_class', $options, '->load() does not set the base_template_class if none is provided'); - $this->assertEquals('/tmp', $options['cache'], '->load() sets the cache option'); $this->assertEquals('ISO-8859-1', $options['charset'], '->load() sets the charset option'); $this->assertTrue($options['debug'], '->load() sets the debug option'); $this->assertTrue($options['strict_variables'], '->load() sets the strict_variables option'); + $this->assertEquals($buildDir !== null ? new Reference('twig.template_cache.chain') : '%kernel.cache_dir%/twig', $options['cache'], '->load() sets the cache option'); + } + + /** + * @dataProvider getFormatsAndBuildDir + */ + public function testLoadNoCacheConfiguration(string $format, ?string $buildDir) + { + $container = $this->createContainer($buildDir); + $container->registerExtension(new TwigExtension()); + $this->loadFromFile($container, 'no-cache', $format); + $this->compileContainer($container); + + $this->assertEquals(Environment::class, $container->getDefinition('twig')->getClass(), '->load() loads the twig.xml file'); + + // Twig options + $options = $container->getDefinition('twig')->getArgument(1); + $this->assertFalse($options['cache'], '->load() sets cache option to false'); + } + + /** + * @dataProvider getFormatsAndBuildDir + */ + public function testLoadPathCacheConfiguration(string $format, ?string $buildDir) + { + $container = $this->createContainer($buildDir); + $container->registerExtension(new TwigExtension()); + $this->loadFromFile($container, 'path-cache', $format); + $this->compileContainer($container); + + $this->assertEquals(Environment::class, $container->getDefinition('twig')->getClass(), '->load() loads the twig.xml file'); + + // Twig options + $options = $container->getDefinition('twig')->getArgument(1); + $this->assertSame('random-path', $options['cache'], '->load() sets cache option to string path'); + } + + /** + * @dataProvider getFormatsAndBuildDir + */ + public function testLoadProdCacheConfiguration(string $format, ?string $buildDir) + { + $container = $this->createContainer($buildDir); + $container->registerExtension(new TwigExtension()); + $this->loadFromFile($container, 'prod-cache', $format); + $this->compileContainer($container); + + $this->assertEquals(Environment::class, $container->getDefinition('twig')->getClass(), '->load() loads the twig.xml file'); + + // Twig options + $options = $container->getDefinition('twig')->getArgument(1); + $this->assertEquals($buildDir !== null ? new Reference('twig.template_cache.chain') : '%kernel.cache_dir%/twig', $options['cache'], '->load() sets cache option to CacheChain reference'); } /** @@ -238,6 +296,19 @@ public static function getFormats(): array ]; } + public static function getFormatsAndBuildDir(): array + { + return [ + ['php', null], + ['php', __DIR__.'/build'], + ['yml', null], + ['yml', __DIR__.'/build'], + ['xml', null], + ['xml', __DIR__.'/build'], + ]; + } + + /** * @dataProvider stopwatchExtensionAvailabilityProvider */ @@ -312,10 +383,11 @@ public function testCustomHtmlToTextConverterService(string $format) $this->assertEquals(new Reference('my_converter'), $bodyRenderer->getArgument('$converter')); } - private function createContainer(): ContainerBuilder + private function createContainer(?string $buildDir = null): ContainerBuilder { $container = new ContainerBuilder(new ParameterBag([ 'kernel.cache_dir' => __DIR__, + 'kernel.build_dir' => $buildDir ?? __DIR__, 'kernel.project_dir' => __DIR__, 'kernel.charset' => 'UTF-8', 'kernel.debug' => false, diff --git a/src/Symfony/Bundle/TwigBundle/Tests/Functional/AttributeExtensionTest.php b/src/Symfony/Bundle/TwigBundle/Tests/Functional/AttributeExtensionTest.php index e9bd8e2e93a90..8b4e4555f36a0 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/Functional/AttributeExtensionTest.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/Functional/AttributeExtensionTest.php @@ -11,11 +11,15 @@ namespace Symfony\Bundle\TwigBundle\Tests\Functional; +use PHPUnit\Framework\Attributes\After; +use PHPUnit\Framework\Attributes\Before; +use PHPUnit\Framework\Attributes\BeforeClass; use Symfony\Bundle\FrameworkBundle\FrameworkBundle; use Symfony\Bundle\TwigBundle\Tests\TestCase; use Symfony\Bundle\TwigBundle\TwigBundle; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\LogicException; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\HttpKernel\Kernel; use Twig\Attribute\AsTwigFilter; @@ -23,26 +27,27 @@ use Twig\Attribute\AsTwigTest; use Twig\Environment; use Twig\Error\RuntimeError; +use Twig\Extension\AbstractExtension; use Twig\Extension\AttributeExtension; class AttributeExtensionTest extends TestCase { - public function testExtensionWithAttributes() + /** @beforeClass */ + #[BeforeClass] + public static function assertTwigVersion(): void { if (!class_exists(AttributeExtension::class)) { self::markTestSkipped('Twig 3.21 is required.'); } + } - $kernel = new class('test', true) extends Kernel - { - public function registerBundles(): iterable - { - return [new FrameworkBundle(), new TwigBundle()]; - } - + public function testExtensionWithAttributes() + { + $kernel = new class extends AttributeExtensionKernel { public function registerContainerConfiguration(LoaderInterface $loader): void { $loader->load(static function (ContainerBuilder $container) { + $container->setParameter('kernel.secret', 'secret'); $container->register(StaticExtensionWithAttributes::class, StaticExtensionWithAttributes::class) ->setAutoconfigured(true); $container->register(RuntimeExtensionWithAttributes::class, RuntimeExtensionWithAttributes::class) @@ -52,11 +57,6 @@ public function registerContainerConfiguration(LoaderInterface $loader): void $container->setAlias('twig_test', 'twig')->setPublic(true); }); } - - public function getProjectDir(): string - { - return sys_get_temp_dir().'/'.Kernel::VERSION.'/AttributeExtension'; - } }; $kernel->boot(); @@ -72,10 +72,30 @@ public function getProjectDir(): string $twig->getRuntime(StaticExtensionWithAttributes::class); } + public function testInvalidExtensionClass() + { + $kernel = new class extends AttributeExtensionKernel { + public function registerContainerConfiguration(LoaderInterface $loader): void + { + $loader->load(static function (ContainerBuilder $container) { + $container->register(InvalidExtensionWithAttributes::class, InvalidExtensionWithAttributes::class) + ->setAutoconfigured(true); + }); + } + }; + + $this->expectException(LogicException::class); + $this->expectExceptionMessage('The class "Symfony\Bundle\TwigBundle\Tests\Functional\InvalidExtensionWithAttributes" cannot extend "Twig\Extension\AbstractExtension" and use the "#[Twig\Attribute\AsTwigFilter]" attribute on method "funFilter()", choose one or the other.'); + + $kernel->boot(); + } + + /** * @before * @after */ + #[Before, After] protected function deleteTempDir() { if (file_exists($dir = sys_get_temp_dir().'/'.Kernel::VERSION.'/AttributeExtension')) { @@ -84,6 +104,24 @@ protected function deleteTempDir() } } +abstract class AttributeExtensionKernel extends Kernel +{ + public function __construct() + { + parent::__construct('test', true); + } + + public function registerBundles(): iterable + { + return [new FrameworkBundle(), new TwigBundle()]; + } + + public function getProjectDir(): string + { + return sys_get_temp_dir().'/'.Kernel::VERSION.'/AttributeExtension'; + } +} + class StaticExtensionWithAttributes { #[AsTwigFilter('foo')] @@ -111,10 +149,19 @@ public function __construct(private bool $prefix) { } - #[AsTwigFilter('foo')] - #[AsTwigFunction('foo')] + #[AsTwigFilter('prefix_foo')] + #[AsTwigFunction('prefix_foo')] public function prefix(string $value): string { return $this->prefix.$value; } } + +class InvalidExtensionWithAttributes extends AbstractExtension +{ + #[AsTwigFilter('fun')] + public function funFilter(): string + { + return 'fun'; + } +} diff --git a/src/Symfony/Bundle/TwigBundle/composer.json b/src/Symfony/Bundle/TwigBundle/composer.json index f6e0e110cc686..221a7f471290e 100644 --- a/src/Symfony/Bundle/TwigBundle/composer.json +++ b/src/Symfony/Bundle/TwigBundle/composer.json @@ -18,9 +18,9 @@ "require": { "php": ">=8.2", "composer-runtime-api": ">=2.1", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", + "symfony/twig-bridge": "^7.3", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "twig/twig": "^3.12" diff --git a/src/Symfony/Bundle/WebProfilerBundle/CHANGELOG.md b/src/Symfony/Bundle/WebProfilerBundle/CHANGELOG.md index 539d814d2a438..5e5e8db36e233 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/WebProfilerBundle/CHANGELOG.md @@ -4,6 +4,34 @@ CHANGELOG 7.3 --- + * Add `profiler.php` and `wdt.php` routing configuration files (use them instead of their XML equivalent) + + Before: + + ```yaml + when@dev: + web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + + web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler + ``` + + After: + + ```yaml + when@dev: + web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.php' + prefix: /_wdt + + web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.php + prefix: /_profiler + ``` + * Add `ajax_replace` option for replacing toolbar on AJAX requests 7.2 diff --git a/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php index d9ca50a27af21..649bf459e8fed 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/Configuration.php @@ -31,7 +31,9 @@ public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('web_profiler'); - $treeBuilder->getRootNode() + $treeBuilder + ->getRootNode() + ->docUrl('https://symfony.com/doc/{version:major}.{version:minor}/reference/configuration/web_profiler.html', 'symfony/web-profiler-bundle') ->children() ->arrayNode('toolbar') ->info('Profiler toolbar configuration') diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/profiler.php b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/profiler.php new file mode 100644 index 0000000000000..09e022be922b0 --- /dev/null +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/profiler.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; +use Symfony\Component\Routing\Loader\XmlFileLoader; + +return function (RoutingConfigurator $routes): void { + foreach (debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT) as $trace) { + if (isset($trace['object']) && $trace['object'] instanceof XmlFileLoader && 'doImport' === $trace['function']) { + if (__DIR__ === dirname(realpath($trace['args'][3]))) { + trigger_deprecation('symfony/routing', '7.3', 'The "profiler.xml" routing configuration file is deprecated, import "profiler.php" instead.'); + + break; + } + } + } + + $routes->add('_profiler_home', '/') + ->controller('web_profiler.controller.profiler::homeAction') + ; + $routes->add('_profiler_search', '/search') + ->controller('web_profiler.controller.profiler::searchAction') + ; + $routes->add('_profiler_search_bar', '/search_bar') + ->controller('web_profiler.controller.profiler::searchBarAction') + ; + $routes->add('_profiler_phpinfo', '/phpinfo') + ->controller('web_profiler.controller.profiler::phpinfoAction') + ; + $routes->add('_profiler_xdebug', '/xdebug') + ->controller('web_profiler.controller.profiler::xdebugAction') + ; + $routes->add('_profiler_font', '/font/{fontName}.woff2') + ->controller('web_profiler.controller.profiler::fontAction') + ; + $routes->add('_profiler_search_results', '/{token}/search/results') + ->controller('web_profiler.controller.profiler::searchResultsAction') + ; + $routes->add('_profiler_open_file', '/open') + ->controller('web_profiler.controller.profiler::openAction') + ; + $routes->add('_profiler', '/{token}') + ->controller('web_profiler.controller.profiler::panelAction') + ; + $routes->add('_profiler_router', '/{token}/router') + ->controller('web_profiler.controller.router::panelAction') + ; + $routes->add('_profiler_exception', '/{token}/exception') + ->controller('web_profiler.controller.exception_panel::body') + ; + $routes->add('_profiler_exception_css', '/{token}/exception.css') + ->controller('web_profiler.controller.exception_panel::stylesheet') + ; +}; diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/profiler.xml b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/profiler.xml index 363b15d872b0c..8712f38774a74 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/profiler.xml +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/profiler.xml @@ -4,52 +4,5 @@ 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::homeAction - - - - web_profiler.controller.profiler::searchAction - - - - web_profiler.controller.profiler::searchBarAction - - - - web_profiler.controller.profiler::phpinfoAction - - - - web_profiler.controller.profiler::xdebugAction - - - - web_profiler.controller.profiler::fontAction - - - - web_profiler.controller.profiler::searchResultsAction - - - - web_profiler.controller.profiler::openAction - - - - web_profiler.controller.profiler::panelAction - - - - web_profiler.controller.router::panelAction - - - - web_profiler.controller.exception_panel::body - - - - web_profiler.controller.exception_panel::stylesheet - - + diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.php b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.php new file mode 100644 index 0000000000000..d0383ee8fbef9 --- /dev/null +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; +use Symfony\Component\Routing\Loader\XmlFileLoader; + +return function (RoutingConfigurator $routes): void { + foreach (debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT) as $trace) { + if (isset($trace['object']) && $trace['object'] instanceof XmlFileLoader && 'doImport' === $trace['function']) { + if (__DIR__ === dirname(realpath($trace['args'][3]))) { + trigger_deprecation('symfony/routing', '7.3', 'The "wdt.xml" routing configuration file is deprecated, import "wdt.php" instead.'); + + break; + } + } + } + + $routes->add('_wdt_stylesheet', '/styles') + ->controller('web_profiler.controller.profiler::toolbarStylesheetAction') + ; + $routes->add('_wdt', '/{token}') + ->controller('web_profiler.controller.profiler::toolbarAction') + ; +}; diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml index 9f45f1b7490ae..04bddb4f3a1b9 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml @@ -4,11 +4,5 @@ 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 - - - - web_profiler.controller.profiler::toolbarAction - + diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/workflow.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/workflow.html.twig index 6f09b36355056..dfe7beac0932f 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/workflow.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/workflow.html.twig @@ -137,20 +137,22 @@ {{ source('@WebProfiler/Script/Mermaid/mermaid-flowchart-v2.min.js') }} const isDarkMode = document.querySelector('body').classList.contains('theme-dark'); mermaid.initialize({ - flowchart: { useMaxWidth: false }, + flowchart: { + useMaxWidth: true, + }, securityLevel: 'loose', - 'theme': 'base', - 'themeVariables': { + theme: 'base', + themeVariables: { darkMode: isDarkMode, - 'fontFamily': 'var(--font-family-system)', - 'fontSize': 'var(--font-size-body)', + fontFamily: 'var(--font-family-system)', + fontSize: 'var(--font-size-body)', // the properties below don't support CSS variables - 'primaryColor': isDarkMode ? 'lightsteelblue' : 'aliceblue', - 'primaryTextColor': isDarkMode ? '#000' : '#000', - 'primaryBorderColor': isDarkMode ? 'steelblue' : 'lightsteelblue', - 'lineColor': isDarkMode ? '#939393' : '#d4d4d4', - 'secondaryColor': isDarkMode ? 'lightyellow' : 'lightyellow', - 'tertiaryColor': isDarkMode ? 'lightSalmon' : 'lightSalmon', + primaryColor: isDarkMode ? 'lightsteelblue' : 'aliceblue', + primaryTextColor: isDarkMode ? '#000' : '#000', + primaryBorderColor: isDarkMode ? 'steelblue' : 'lightsteelblue', + lineColor: isDarkMode ? '#939393' : '#d4d4d4', + secondaryColor: isDarkMode ? 'lightyellow' : 'lightyellow', + tertiaryColor: isDarkMode ? 'lightSalmon' : 'lightSalmon', } }); @@ -275,6 +277,7 @@ click {{ nodeId }} showNodeDetails{{ collector.hash(name) }} {% endfor %} + View on mermaid.live

Calls

diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig index 91e6dc05e658c..5adfd27796acf 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig @@ -144,7 +144,7 @@ var ajaxToolbarPanel = document.querySelector('.sf-toolbar-block-ajax'); if (requestStack.length) { - ajaxToolbarPanel.style.display = 'block'; + ajaxToolbarPanel.style.display = ''; } else { ajaxToolbarPanel.style.display = 'none'; } diff --git a/src/Symfony/Bundle/WebProfilerBundle/Tests/Functional/WebProfilerBundleKernel.php b/src/Symfony/Bundle/WebProfilerBundle/Tests/Functional/WebProfilerBundleKernel.php index f4a9f939e274b..0447e5787401e 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Tests/Functional/WebProfilerBundleKernel.php +++ b/src/Symfony/Bundle/WebProfilerBundle/Tests/Functional/WebProfilerBundleKernel.php @@ -43,8 +43,8 @@ public function registerBundles(): iterable protected function configureRoutes(RoutingConfigurator $routes): void { - $routes->import(__DIR__.'/../../Resources/config/routing/profiler.xml')->prefix('/_profiler'); - $routes->import(__DIR__.'/../../Resources/config/routing/wdt.xml')->prefix('/_wdt'); + $routes->import(__DIR__.'/../../Resources/config/routing/profiler.php')->prefix('/_profiler'); + $routes->import(__DIR__.'/../../Resources/config/routing/wdt.php')->prefix('/_wdt'); $routes->add('_', '/')->controller('kernel::homepageController'); } diff --git a/src/Symfony/Bundle/WebProfilerBundle/composer.json b/src/Symfony/Bundle/WebProfilerBundle/composer.json index ce94b4b62ebbb..00269dd279d45 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/composer.json +++ b/src/Symfony/Bundle/WebProfilerBundle/composer.json @@ -17,7 +17,9 @@ ], "require": { "php": ">=8.2", - "symfony/config": "^6.4|^7.0", + "composer-runtime-api": ">=2.1", + "symfony/config": "^7.3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/framework-bundle": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/routing": "^6.4|^7.0", @@ -34,7 +36,8 @@ "symfony/form": "<6.4", "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", - "symfony/serializer": "<7.2" + "symfony/serializer": "<7.2", + "symfony/workflow": "<7.3" }, "autoload": { "psr-4": { "Symfony\\Bundle\\WebProfilerBundle\\": "" }, diff --git a/src/Symfony/Component/AssetMapper/Compiler/Parser/JavascriptSequenceParser.php b/src/Symfony/Component/AssetMapper/Compiler/Parser/JavascriptSequenceParser.php index 943c0eea14f51..7531221a8e5ee 100644 --- a/src/Symfony/Component/AssetMapper/Compiler/Parser/JavascriptSequenceParser.php +++ b/src/Symfony/Component/AssetMapper/Compiler/Parser/JavascriptSequenceParser.php @@ -133,36 +133,35 @@ public function parseUntil(int $position): void continue; } - // Single-line string - if ('"' === $matchChar || "'" === $matchChar) { - if (false === $endPos = strpos($this->content, $matchChar, $matchPos + 1)) { - $this->endsWithSequence(self::STATE_STRING, $position); - - return; - } - while (false !== $endPos && '\\' == $this->content[$endPos - 1]) { - $endPos = strpos($this->content, $matchChar, $endPos + 1); + if ('"' === $matchChar || "'" === $matchChar || '`' === $matchChar) { + $endPos = $matchPos + 1; + while (false !== $endPos = strpos($this->content, $matchChar, $endPos)) { + $backslashes = 0; + $i = $endPos - 1; + while ($i >= 0 && $this->content[$i] === '\\') { + $backslashes++; + $i--; + } + + if (0 === $backslashes % 2) { + break; + } + + $endPos++; } - $this->cursor = min($endPos + 1, $position); - $this->setSequence(self::STATE_STRING, $endPos + 1); - continue; - } - - // Multi-line string - if ('`' === $matchChar) { - if (false === $endPos = strpos($this->content, $matchChar, $matchPos + 1)) { + if (false === $endPos) { $this->endsWithSequence(self::STATE_STRING, $position); - return; } - while (false !== $endPos && '\\' == $this->content[$endPos - 1]) { - $endPos = strpos($this->content, $matchChar, $endPos + 1); - } $this->cursor = min($endPos + 1, $position); $this->setSequence(self::STATE_STRING, $endPos + 1); + continue; } + + // Fallback + $this->cursor = $matchPos + 1; } } diff --git a/src/Symfony/Component/AssetMapper/Tests/Compiler/Parser/JavascriptSequenceParserTest.php b/src/Symfony/Component/AssetMapper/Tests/Compiler/Parser/JavascriptSequenceParserTest.php index cd9c88ff72593..794b7bbf61d94 100644 --- a/src/Symfony/Component/AssetMapper/Tests/Compiler/Parser/JavascriptSequenceParserTest.php +++ b/src/Symfony/Component/AssetMapper/Tests/Compiler/Parser/JavascriptSequenceParserTest.php @@ -230,5 +230,10 @@ public static function provideStringCases(): iterable 3, false, ]; + yield 'after unclosed string' => [ + '"hello', + 6, + true, + ]; } } 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 7deb9dc6e2187..c9ee94ee9c922 100644 --- a/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php @@ -338,7 +338,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 c3a4909e211df..8e52dfee240a0 100644 --- a/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php @@ -359,9 +359,16 @@ private function getPlatformName(): string $platform = $this->conn->getDatabasePlatform(); + if (interface_exists(DBALException::class)) { + // DBAL 4+ + $sqlitePlatformClass = 'Doctrine\DBAL\Platforms\SQLitePlatform'; + } else { + $sqlitePlatformClass = 'Doctrine\DBAL\Platforms\SqlitePlatform'; + } + return $this->platformName = match (true) { $platform instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform => 'mysql', - $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform => 'sqlite', + $platform instanceof $sqlitePlatformClass => 'sqlite', $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform => 'pgsql', $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform => 'oci', $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform => 'sqlsrv', diff --git a/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php b/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php index 43628e4cedbf0..3e1bf2bf7a9a9 100644 --- a/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php @@ -34,6 +34,7 @@ class TraceableAdapter implements AdapterInterface, CacheInterface, NamespacedPo public function __construct( protected AdapterInterface $pool, + protected readonly ?\Closure $disabled = null, ) { } @@ -45,6 +46,9 @@ public function get(string $key, callable $callback, ?float $beta = null, ?array if (!$this->pool instanceof CacheInterface) { throw new BadMethodCallException(\sprintf('Cannot call "%s::get()": this class doesn\'t implement "%s".', get_debug_type($this->pool), CacheInterface::class)); } + if ($this->disabled?->__invoke()) { + return $this->pool->get($key, $callback, $beta, $metadata); + } $isHit = true; $callback = function (CacheItem $item, bool &$save) use ($callback, &$isHit) { @@ -71,6 +75,9 @@ public function get(string $key, callable $callback, ?float $beta = null, ?array public function getItem(mixed $key): CacheItem { + if ($this->disabled?->__invoke()) { + return $this->pool->getItem($key); + } $event = $this->start(__FUNCTION__); try { $item = $this->pool->getItem($key); @@ -88,6 +95,9 @@ public function getItem(mixed $key): CacheItem public function hasItem(mixed $key): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->hasItem($key); + } $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->hasItem($key); @@ -98,6 +108,9 @@ public function hasItem(mixed $key): bool public function deleteItem(mixed $key): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->deleteItem($key); + } $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->deleteItem($key); @@ -108,6 +121,9 @@ public function deleteItem(mixed $key): bool public function save(CacheItemInterface $item): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->save($item); + } $event = $this->start(__FUNCTION__); try { return $event->result[$item->getKey()] = $this->pool->save($item); @@ -118,6 +134,9 @@ public function save(CacheItemInterface $item): bool public function saveDeferred(CacheItemInterface $item): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->saveDeferred($item); + } $event = $this->start(__FUNCTION__); try { return $event->result[$item->getKey()] = $this->pool->saveDeferred($item); @@ -128,6 +147,9 @@ public function saveDeferred(CacheItemInterface $item): bool public function getItems(array $keys = []): iterable { + if ($this->disabled?->__invoke()) { + return $this->pool->getItems($keys); + } $event = $this->start(__FUNCTION__); try { $result = $this->pool->getItems($keys); @@ -151,6 +173,9 @@ public function getItems(array $keys = []): iterable public function clear(string $prefix = ''): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->clear($prefix); + } $event = $this->start(__FUNCTION__); try { if ($this->pool instanceof AdapterInterface) { @@ -165,6 +190,9 @@ public function clear(string $prefix = ''): bool public function deleteItems(array $keys): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->deleteItems($keys); + } $event = $this->start(__FUNCTION__); $event->result['keys'] = $keys; try { @@ -176,6 +204,9 @@ public function deleteItems(array $keys): bool public function commit(): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->commit(); + } $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->commit(); @@ -189,6 +220,9 @@ public function prune(): bool if (!$this->pool instanceof PruneableInterface) { return false; } + if ($this->disabled?->__invoke()) { + return $this->pool->prune(); + } $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->prune(); @@ -208,6 +242,9 @@ public function reset(): void public function delete(string $key): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->deleteItem($key); + } $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->deleteItem($key); diff --git a/src/Symfony/Component/Cache/Adapter/TraceableTagAwareAdapter.php b/src/Symfony/Component/Cache/Adapter/TraceableTagAwareAdapter.php index c85d199e49cb6..bde27c68a740f 100644 --- a/src/Symfony/Component/Cache/Adapter/TraceableTagAwareAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/TraceableTagAwareAdapter.php @@ -18,13 +18,16 @@ */ class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface { - public function __construct(TagAwareAdapterInterface $pool) + public function __construct(TagAwareAdapterInterface $pool, ?\Closure $disabled = null) { - parent::__construct($pool); + parent::__construct($pool, $disabled); } public function invalidateTags(array $tags): bool { + if ($this->disabled?->__invoke()) { + return $this->pool->invalidateTags($tags); + } $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->invalidateTags($tags); 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/DependencyInjection/CacheCollectorPass.php b/src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php index ed957406dafbe..0b8d6aed569dc 100644 --- a/src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php +++ b/src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php @@ -52,7 +52,7 @@ private function addToCollector(string $id, string $name, ContainerBuilder $cont if (!$definition->isPublic() || !$definition->isPrivate()) { $recorder->setPublic($definition->isPublic()); } - $recorder->setArguments([new Reference($innerId = $id.'.recorder_inner')]); + $recorder->setArguments([new Reference($innerId = $id.'.recorder_inner'), new Reference('profiler.is_disabled_state_checker', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE)]); foreach ($definition->getMethodCalls() as [$method, $args]) { if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) { diff --git a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php index 35eefb501b5a6..896ca94a1425b 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php @@ -352,6 +352,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()); + } + public function testNamespaces() { if (isset($this->skippedTests[__FUNCTION__])) { diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php index 5bc2bfeb1fedd..0c856e6f5770c 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/Traits/Relay/BgsaveTrait.php b/src/Symfony/Component/Cache/Traits/Relay/BgsaveTrait.php new file mode 100644 index 0000000000000..367f82f7bb2b6 --- /dev/null +++ b/src/Symfony/Component/Cache/Traits/Relay/BgsaveTrait.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits\Relay; + +if (version_compare(phpversion('relay'), '0.11', '>=')) { + /** + * @internal + */ + trait BgsaveTrait + { + public function bgsave($arg = null): \Relay\Relay|bool + { + return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args()); + } + } +} else { + /** + * @internal + */ + trait BgsaveTrait + { + public function bgsave($schedule = false): \Relay\Relay|bool + { + return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args()); + } + } +} diff --git a/src/Symfony/Component/Cache/Traits/RelayProxy.php b/src/Symfony/Component/Cache/Traits/RelayProxy.php index e0ca8873a0182..b6d48dd543dba 100644 --- a/src/Symfony/Component/Cache/Traits/RelayProxy.php +++ b/src/Symfony/Component/Cache/Traits/RelayProxy.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Cache\Traits; +use Symfony\Component\Cache\Traits\Relay\BgsaveTrait; use Symfony\Component\Cache\Traits\Relay\CopyTrait; use Symfony\Component\Cache\Traits\Relay\GeosearchTrait; use Symfony\Component\Cache\Traits\Relay\GetrangeTrait; @@ -31,6 +32,7 @@ class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); */ class RelayProxy extends \Relay\Relay implements ResetInterface, LazyObjectInterface { + use BgsaveTrait; use CopyTrait; use GeosearchTrait; use GetrangeTrait; @@ -338,11 +340,6 @@ public function lcs($key1, $key2, $options = null): mixed return $this->initializeLazyObject()->lcs(...\func_get_args()); } - public function bgsave($schedule = false): \Relay\Relay|bool - { - return $this->initializeLazyObject()->bgsave(...\func_get_args()); - } - public function save(): \Relay\Relay|bool { return $this->initializeLazyObject()->save(...\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/CHANGELOG.md b/src/Symfony/Component/Config/CHANGELOG.md index 0a9a6c0e08372..6ee63f82c72ff 100644 --- a/src/Symfony/Component/Config/CHANGELOG.md +++ b/src/Symfony/Component/Config/CHANGELOG.md @@ -7,6 +7,7 @@ CHANGELOG * Add `ExprBuilder::ifFalse()` * Add support for info on `ArrayNodeDefinition::canBeEnabled()` and `ArrayNodeDefinition::canBeDisabled()` * Allow using an enum FQCN with `EnumNode` + * Add `NodeDefinition::docUrl()` 7.2 --- diff --git a/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php b/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php index 54e976e246ec6..fdfbdabd29ad0 100644 --- a/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php +++ b/src/Symfony/Component/Config/Definition/Builder/NodeDefinition.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Config\Definition\Builder; +use Composer\InstalledVersions; use Symfony\Component\Config\Definition\BaseNode; use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException; use Symfony\Component\Config\Definition\NodeInterface; @@ -76,6 +77,26 @@ public function example(string|array $example): static return $this->attribute('example', $example); } + /** + * Sets the documentation URI, as usually put in the "@see" tag of a doc block. This + * can either be a URL or a file path. You can use the placeholders {package}, + * {version:major} and {version:minor} in the URI. + * + * @return $this + */ + public function docUrl(string $uri, ?string $package = null): static + { + if ($package) { + preg_match('/^(\d+)\.(\d+)\.(\d+)/', InstalledVersions::getVersion($package) ?? '', $m); + } + + return $this->attribute('docUrl', strtr($uri, [ + '{package}' => $package ?? '', + '{version:major}' => $m[1] ?? '', + '{version:minor}' => $m[2] ?? '', + ])); + } + /** * Sets an attribute on the node. * diff --git a/src/Symfony/Component/Config/ResourceCheckerConfigCache.php b/src/Symfony/Component/Config/ResourceCheckerConfigCache.php index 5e2cc1f3c75c0..955aee7e575ad 100644 --- a/src/Symfony/Component/Config/ResourceCheckerConfigCache.php +++ b/src/Symfony/Component/Config/ResourceCheckerConfigCache.php @@ -127,7 +127,7 @@ 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 = unserialize($ser, ['allowed_classes' => false]); $ser = @json_encode($ser, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE) ?: []; $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/Definition/Builder/NodeDefinitionTest.php b/src/Symfony/Component/Config/Tests/Definition/Builder/NodeDefinitionTest.php index 68c1ddff00d91..baa4518006bb6 100644 --- a/src/Symfony/Component/Config/Tests/Definition/Builder/NodeDefinitionTest.php +++ b/src/Symfony/Component/Config/Tests/Definition/Builder/NodeDefinitionTest.php @@ -35,4 +35,35 @@ public function testSetPathSeparatorChangesChildren() $parentNode->setPathSeparator('/'); } + + public function testDocUrl() + { + $node = new ArrayNodeDefinition('node'); + $node->docUrl('https://example.com/doc/{package}/{version:major}.{version:minor}', 'phpunit/phpunit'); + + $r = new \ReflectionObject($node); + $p = $r->getProperty('attributes'); + + $this->assertMatchesRegularExpression('~^https://example.com/doc/phpunit/phpunit/\d+\.\d+$~', $p->getValue($node)['docUrl']); + } + + public function testDocUrlWithoutPackage() + { + $node = new ArrayNodeDefinition('node'); + $node->docUrl('https://example.com/doc/empty{version:major}.empty{version:minor}'); + + $r = new \ReflectionObject($node); + $p = $r->getProperty('attributes'); + + $this->assertSame('https://example.com/doc/empty.empty', $p->getValue($node)['docUrl']); + } + + public function testUnknownPackageThrowsException() + { + $this->expectException(\OutOfBoundsException::class); + $this->expectExceptionMessage('Package "phpunit/invalid" is not installed'); + + $node = new ArrayNodeDefinition('node'); + $node->docUrl('https://example.com/doc/{package}/{version:major}.{version:minor}', 'phpunit/invalid'); + } } diff --git a/src/Symfony/Component/Console/Application.php b/src/Symfony/Component/Console/Application.php index 78d885d2597a9..b4539fa1eeb50 100644 --- a/src/Symfony/Component/Console/Application.php +++ b/src/Symfony/Component/Console/Application.php @@ -17,7 +17,6 @@ use Symfony\Component\Console\Command\HelpCommand; use Symfony\Component\Console\Command\LazyCommand; use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Command\SignalableCommandInterface; use Symfony\Component\Console\CommandLoader\CommandLoaderInterface; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; @@ -1005,8 +1004,7 @@ protected function doRunCommand(Command $command, InputInterface $input, OutputI } } - $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : []; - if ($commandSignals || $this->dispatcher && $this->signalsToDispatchEvent) { + if (($commandSignals = $command->getSubscribedSignals()) || $this->dispatcher && $this->signalsToDispatchEvent) { $signalRegistry = $this->getSignalRegistry(); if (Terminal::hasSttyAvailable()) { diff --git a/src/Symfony/Component/Console/Attribute/Argument.php b/src/Symfony/Component/Console/Attribute/Argument.php index 099d49676e033..e6a94d2f10e4c 100644 --- a/src/Symfony/Component/Console/Attribute/Argument.php +++ b/src/Symfony/Component/Console/Attribute/Argument.php @@ -16,6 +16,7 @@ use Symfony\Component\Console\Exception\LogicException; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\String\UnicodeString; #[\Attribute(\Attribute::TARGET_PARAMETER)] class Argument @@ -25,6 +26,7 @@ class Argument private string|bool|int|float|array|null $default = null; private array|\Closure $suggestedValues; private ?int $mode = null; + private string $function = ''; /** * Represents a console command definition. @@ -34,8 +36,8 @@ class Argument * @param array|callable(CompletionInput):list $suggestedValues The values used for input completion */ public function __construct( - public string $name = '', public string $description = '', + public string $name = '', array|callable $suggestedValues = [], ) { $this->suggestedValues = \is_callable($suggestedValues) ? $suggestedValues(...) : $suggestedValues; @@ -51,21 +53,27 @@ public static function tryFrom(\ReflectionParameter $parameter): ?self return null; } + if (($function = $parameter->getDeclaringFunction()) instanceof \ReflectionMethod) { + $self->function = $function->class.'::'.$function->name; + } else { + $self->function = $function->name; + } + $type = $parameter->getType(); $name = $parameter->getName(); if (!$type instanceof \ReflectionNamedType) { - throw new LogicException(\sprintf('The parameter "$%s" must have a named type. Untyped, Union or Intersection types are not supported for command arguments.', $name)); + throw new LogicException(\sprintf('The parameter "$%s" of "%s()" must have a named type. Untyped, Union or Intersection types are not supported for command arguments.', $name, $self->function)); } $parameterTypeName = $type->getName(); if (!\in_array($parameterTypeName, self::ALLOWED_TYPES, true)) { - throw new LogicException(\sprintf('The type "%s" of parameter "$%s" is not supported as a command argument. Only "%s" types are allowed.', $parameterTypeName, $name, implode('", "', self::ALLOWED_TYPES))); + throw new LogicException(\sprintf('The type "%s" on parameter "$%s" of "%s()" is not supported as a command argument. Only "%s" types are allowed.', $parameterTypeName, $name, $self->function, implode('", "', self::ALLOWED_TYPES))); } if (!$self->name) { - $self->name = $name; + $self->name = (new UnicodeString($name))->kebab(); } $self->default = $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null; diff --git a/src/Symfony/Component/Console/Attribute/Option.php b/src/Symfony/Component/Console/Attribute/Option.php index 02002a5ad1256..2f0256b177658 100644 --- a/src/Symfony/Component/Console/Attribute/Option.php +++ b/src/Symfony/Component/Console/Attribute/Option.php @@ -16,17 +16,20 @@ use Symfony\Component\Console\Exception\LogicException; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\String\UnicodeString; #[\Attribute(\Attribute::TARGET_PARAMETER)] class Option { private const ALLOWED_TYPES = ['string', 'bool', 'int', 'float', 'array']; + private const ALLOWED_UNION_TYPES = ['bool|string', 'bool|int', 'bool|float']; private string|bool|int|float|array|null $default = null; private array|\Closure $suggestedValues; private ?int $mode = null; private string $typeName = ''; private bool $allowNull = false; + private string $function = ''; /** * Represents a console command --option definition. @@ -37,9 +40,9 @@ class Option * @param array|callable(CompletionInput):list $suggestedValues The values used for input completion */ public function __construct( + public string $description = '', public string $name = '', public array|string|null $shortcut = null, - public string $description = '', array|callable $suggestedValues = [], ) { $this->suggestedValues = \is_callable($suggestedValues) ? $suggestedValues(...) : $suggestedValues; @@ -55,40 +58,57 @@ public static function tryFrom(\ReflectionParameter $parameter): ?self return null; } - $type = $parameter->getType(); + if (($function = $parameter->getDeclaringFunction()) instanceof \ReflectionMethod) { + $self->function = $function->class.'::'.$function->name; + } else { + $self->function = $function->name; + } + $name = $parameter->getName(); + $type = $parameter->getType(); + + if (!$parameter->isDefaultValueAvailable()) { + throw new LogicException(\sprintf('The option parameter "$%s" of "%s()" must declare a default value.', $name, $self->function)); + } + + if (!$self->name) { + $self->name = (new UnicodeString($name))->kebab(); + } + + $self->default = $parameter->getDefaultValue(); + $self->allowNull = $parameter->allowsNull(); + + if ($type instanceof \ReflectionUnionType) { + return $self->handleUnion($type); + } if (!$type instanceof \ReflectionNamedType) { - throw new LogicException(\sprintf('The parameter "$%s" must have a named type. Untyped, Union or Intersection types are not supported for command options.', $name)); + throw new LogicException(\sprintf('The parameter "$%s" of "%s()" must have a named type. Untyped or Intersection types are not supported for command options.', $name, $self->function)); } $self->typeName = $type->getName(); if (!\in_array($self->typeName, self::ALLOWED_TYPES, true)) { - throw new LogicException(\sprintf('The type "%s" of parameter "$%s" is not supported as a command option. Only "%s" types are allowed.', $self->typeName, $name, implode('", "', self::ALLOWED_TYPES))); + throw new LogicException(\sprintf('The type "%s" on parameter "$%s" of "%s()" is not supported as a command option. Only "%s" types are allowed.', $self->typeName, $name, $self->function, implode('", "', self::ALLOWED_TYPES))); } - if (!$parameter->isDefaultValueAvailable()) { - throw new LogicException(\sprintf('The option parameter "$%s" must declare a default value.', $name)); + if ('bool' === $self->typeName && $self->allowNull && \in_array($self->default, [true, false], true)) { + throw new LogicException(\sprintf('The option parameter "$%s" of "%s()" must not be nullable when it has a default boolean value.', $name, $self->function)); } - if (!$self->name) { - $self->name = $name; + if ($self->allowNull && null !== $self->default) { + throw new LogicException(\sprintf('The option parameter "$%s" of "%s()" must either be not-nullable or have a default of null.', $name, $self->function)); } - $self->default = $parameter->getDefaultValue(); - $self->allowNull = $parameter->allowsNull(); - if ('bool' === $self->typeName) { $self->mode = InputOption::VALUE_NONE; if (false !== $self->default) { $self->mode |= InputOption::VALUE_NEGATABLE; } + } elseif ('array' === $self->typeName) { + $self->mode = InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY; } else { - $self->mode = $self->allowNull ? InputOption::VALUE_OPTIONAL : InputOption::VALUE_REQUIRED; - if ('array' === $self->typeName) { - $self->mode |= InputOption::VALUE_IS_ARRAY; - } + $self->mode = InputOption::VALUE_REQUIRED; } if (\is_array($self->suggestedValues) && !\is_callable($self->suggestedValues) && 2 === \count($self->suggestedValues) && ($instance = $parameter->getDeclaringFunction()->getClosureThis()) && $instance::class === $self->suggestedValues[0] && \is_callable([$instance, $self->suggestedValues[1]])) { @@ -116,6 +136,14 @@ public function resolveValue(InputInterface $input): mixed { $value = $input->getOption($this->name); + if (null === $value && \in_array($this->typeName, self::ALLOWED_UNION_TYPES, true)) { + return true; + } + + if ('array' === $this->typeName && $this->allowNull && [] === $value) { + return null; + } + if ('bool' !== $this->typeName) { return $value; } @@ -126,4 +154,28 @@ public function resolveValue(InputInterface $input): mixed return $value ?? $this->default; } + + private function handleUnion(\ReflectionUnionType $type): self + { + $types = array_map( + static fn(\ReflectionType $t) => $t instanceof \ReflectionNamedType ? $t->getName() : null, + $type->getTypes(), + ); + + sort($types); + + $this->typeName = implode('|', array_filter($types)); + + if (!\in_array($this->typeName, self::ALLOWED_UNION_TYPES, true)) { + throw new LogicException(\sprintf('The union type for parameter "$%s" of "%s()" is not supported as a command option. Only "%s" types are allowed.', $this->name, $this->function, implode('", "', self::ALLOWED_UNION_TYPES))); + } + + if (false !== $this->default) { + throw new LogicException(\sprintf('The option parameter "$%s" of "%s()" must have a default value of false.', $this->name, $this->function)); + } + + $this->mode = InputOption::VALUE_OPTIONAL; + + return $this; + } } diff --git a/src/Symfony/Component/Console/CHANGELOG.md b/src/Symfony/Component/Console/CHANGELOG.md index b84099a1d0e10..9f3ae3d7d2326 100644 --- a/src/Symfony/Component/Console/CHANGELOG.md +++ b/src/Symfony/Component/Console/CHANGELOG.md @@ -14,6 +14,7 @@ CHANGELOG * Add support for `LockableTrait` in invokable commands * Deprecate returning a non-integer value from a `\Closure` function set via `Command::setCode()` * Mark `#[AsCommand]` attribute as `@final` + * Add support for `SignalableCommandInterface` with invokable commands 7.2 --- diff --git a/src/Symfony/Component/Console/Command/Command.php b/src/Symfony/Component/Console/Command/Command.php index f79475d56be73..f6cd8499791f1 100644 --- a/src/Symfony/Component/Console/Command/Command.php +++ b/src/Symfony/Component/Console/Command/Command.php @@ -32,7 +32,7 @@ * * @author Fabien Potencier */ -class Command +class Command implements SignalableCommandInterface { // see https://tldp.org/LDP/abs/html/exitcodes.html public const SUCCESS = 0; @@ -134,7 +134,7 @@ public function __construct(?string $name = null) $this->setHelp($attribute?->help ?? ''); } - if (\is_callable($this)) { + if (\is_callable($this) && (new \ReflectionMethod($this, 'execute'))->getDeclaringClass()->name === self::class) { $this->code = new InvokableCommand($this, $this(...)); } @@ -674,6 +674,16 @@ public function getHelper(string $name): HelperInterface return $this->helperSet->get($name); } + public function getSubscribedSignals(): array + { + return $this->code?->getSubscribedSignals() ?? []; + } + + public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false + { + return $this->code?->handleSignal($signal, $previousExitCode) ?? false; + } + /** * Validates a command name. * diff --git a/src/Symfony/Component/Console/Command/InvokableCommand.php b/src/Symfony/Component/Console/Command/InvokableCommand.php index 329d8b253cfb8..72ff407c81fdf 100644 --- a/src/Symfony/Component/Console/Command/InvokableCommand.php +++ b/src/Symfony/Component/Console/Command/InvokableCommand.php @@ -28,9 +28,10 @@ * * @internal */ -class InvokableCommand +class InvokableCommand implements SignalableCommandInterface { private readonly \Closure $code; + private readonly ?SignalableCommandInterface $signalableCommand; private readonly \ReflectionFunction $reflection; private bool $triggerDeprecations = false; @@ -39,6 +40,7 @@ public function __construct( callable $code, ) { $this->code = $this->getClosure($code); + $this->signalableCommand = $code instanceof SignalableCommandInterface ? $code : null; $this->reflection = new \ReflectionFunction($this->code); } @@ -142,4 +144,14 @@ private function getParameters(InputInterface $input, OutputInterface $output): return $parameters ?: [$input, $output]; } + + public function getSubscribedSignals(): array + { + return $this->signalableCommand?->getSubscribedSignals() ?? []; + } + + public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false + { + return $this->signalableCommand?->handleSignal($signal, $previousExitCode) ?? false; + } } diff --git a/src/Symfony/Component/Console/Command/TraceableCommand.php b/src/Symfony/Component/Console/Command/TraceableCommand.php index 659798e651c46..315f385de9aa2 100644 --- a/src/Symfony/Component/Console/Command/TraceableCommand.php +++ b/src/Symfony/Component/Console/Command/TraceableCommand.php @@ -27,7 +27,7 @@ * * @author Jules Pietri */ -final class TraceableCommand extends Command implements SignalableCommandInterface +final class TraceableCommand extends Command { public readonly Command $command; public int $exitCode; @@ -89,15 +89,11 @@ public function __call(string $name, array $arguments): mixed public function getSubscribedSignals(): array { - return $this->command instanceof SignalableCommandInterface ? $this->command->getSubscribedSignals() : []; + return $this->command->getSubscribedSignals(); } public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false { - if (!$this->command instanceof SignalableCommandInterface) { - return false; - } - $event = $this->stopwatch->start($this->getName().'.handle_signal'); $exit = $this->command->handleSignal($signal, $previousExitCode); 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 c5c796517c17a..268f8ba501a9e 100644 --- a/src/Symfony/Component/Console/Tests/ApplicationTest.php +++ b/src/Symfony/Component/Console/Tests/ApplicationTest.php @@ -2255,6 +2255,41 @@ public function testSignalableRestoresStty() $this->assertSame($previousSttyMode, $sttyMode); } + /** + * @requires extension pcntl + */ + public function testSignalableInvokableCommand() + { + $command = new Command(); + $command->setName('signal-invokable'); + $command->setCode($invokable = new class implements SignalableCommandInterface { + use SignalableInvokableCommandTrait; + }); + + $application = $this->createSignalableApplication($command, null); + $application->setSignalsToDispatchEvent(\SIGUSR1); + + $this->assertSame(1, $application->run(new ArrayInput(['signal-invokable']))); + $this->assertTrue($invokable->signaled); + } + + /** + * @requires extension pcntl + */ + public function testSignalableInvokableCommandThatExtendsBaseCommand() + { + $command = new class extends Command implements SignalableCommandInterface { + use SignalableInvokableCommandTrait; + }; + $command->setName('signal-invokable'); + + $application = $this->createSignalableApplication($command, null); + $application->setSignalsToDispatchEvent(\SIGUSR1); + + $this->assertSame(1, $application->run(new ArrayInput(['signal-invokable']))); + $this->assertTrue($command->signaled); + } + /** * @requires extension pcntl */ @@ -2514,7 +2549,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } #[AsCommand(name: 'signal')] -class SignableCommand extends BaseSignableCommand implements SignalableCommandInterface +class SignableCommand extends BaseSignableCommand { public function getSubscribedSignals(): array { @@ -2531,7 +2566,7 @@ public function handleSignal(int $signal, int|false $previousExitCode = 0): int| } #[AsCommand(name: 'signal')] -class TerminatableCommand extends BaseSignableCommand implements SignalableCommandInterface +class TerminatableCommand extends BaseSignableCommand { public function getSubscribedSignals(): array { @@ -2548,7 +2583,7 @@ public function handleSignal(int $signal, int|false $previousExitCode = 0): int| } #[AsCommand(name: 'signal')] -class TerminatableWithEventCommand extends Command implements SignalableCommandInterface, EventSubscriberInterface +class TerminatableWithEventCommand extends Command implements EventSubscriberInterface { private bool $shouldContinue = true; private OutputInterface $output; @@ -2615,8 +2650,39 @@ public static function getSubscribedEvents(): array } } +trait SignalableInvokableCommandTrait +{ + public bool $signaled = false; + + public function __invoke(): int + { + posix_kill(posix_getpid(), \SIGUSR1); + + for ($i = 0; $i < 1000; ++$i) { + usleep(100); + if ($this->signaled) { + return 1; + } + } + + return 0; + } + + public function getSubscribedSignals(): array + { + return SignalRegistry::isSupported() ? [\SIGUSR1] : []; + } + + public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false + { + $this->signaled = true; + + return false; + } +} + #[AsCommand(name: 'alarm')] -class AlarmableCommand extends BaseSignableCommand implements SignalableCommandInterface +class AlarmableCommand extends BaseSignableCommand { public function __construct(private int $alarmInterval) { diff --git a/src/Symfony/Component/Console/Tests/Command/CommandTest.php b/src/Symfony/Component/Console/Tests/Command/CommandTest.php index 64d32b2cb6e76..0db3572fc3476 100644 --- a/src/Symfony/Component/Console/Tests/Command/CommandTest.php +++ b/src/Symfony/Component/Console/Tests/Command/CommandTest.php @@ -12,7 +12,7 @@ namespace Symfony\Component\Console\Tests\Command; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\Console\Application; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; @@ -30,7 +30,7 @@ class CommandTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; protected static string $fixturesPath; @@ -453,8 +453,8 @@ public function testCommandAttribute() */ public function testCommandAttributeWithDeprecatedMethods() { - $this->expectDeprecation('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultName()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); - $this->expectDeprecation('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultDescription()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); + $this->expectUserDeprecationMessage('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultName()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); + $this->expectUserDeprecationMessage('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultDescription()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); $this->assertSame('|foo|f', Php8Command::getDefaultName()); $this->assertSame('desc', Php8Command::getDefaultDescription()); @@ -473,8 +473,8 @@ public function testAttributeOverridesProperty() */ public function testAttributeOverridesPropertyWithDeprecatedMethods() { - $this->expectDeprecation('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultName()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); - $this->expectDeprecation('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultDescription()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); + $this->expectUserDeprecationMessage('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultName()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); + $this->expectUserDeprecationMessage('Since symfony/console 7.3: Method "Symfony\Component\Console\Command\Command::getDefaultDescription()" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); $this->assertSame('my:command', MyAnnotatedCommand::getDefaultName()); $this->assertSame('This is a command I wrote all by myself', MyAnnotatedCommand::getDefaultDescription()); @@ -499,8 +499,8 @@ public function testDefaultCommand() */ public function testDeprecatedMethods() { - $this->expectDeprecation('Since symfony/console 7.3: Overriding "Command::getDefaultName()" in "Symfony\Component\Console\Tests\Command\FooCommand" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); - $this->expectDeprecation('Since symfony/console 7.3: Overriding "Command::getDefaultDescription()" in "Symfony\Component\Console\Tests\Command\FooCommand" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); + $this->expectUserDeprecationMessage('Since symfony/console 7.3: Overriding "Command::getDefaultName()" in "Symfony\Component\Console\Tests\Command\FooCommand" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); + $this->expectUserDeprecationMessage('Since symfony/console 7.3: Overriding "Command::getDefaultDescription()" in "Symfony\Component\Console\Tests\Command\FooCommand" is deprecated and will be removed in Symfony 8.0, use the #[AsCommand] attribute instead.'); new FooCommand(); } @@ -510,7 +510,7 @@ public function testDeprecatedMethods() */ public function testDeprecatedNonIntegerReturnTypeFromClosureCode() { - $this->expectDeprecation('Since symfony/console 7.3: Returning a non-integer value from the command "foo" is deprecated and will throw an exception in Symfony 8.0.'); + $this->expectUserDeprecationMessage('Since symfony/console 7.3: Returning a non-integer value from the command "foo" is deprecated and will throw an exception in Symfony 8.0.'); $command = new Command('foo'); $command->setCode(function () {}); diff --git a/src/Symfony/Component/Console/Tests/Command/InvokableCommandTest.php b/src/Symfony/Component/Console/Tests/Command/InvokableCommandTest.php index b0a337fb0a64b..5ab7951e7f575 100644 --- a/src/Symfony/Component/Console/Tests/Command/InvokableCommandTest.php +++ b/src/Symfony/Component/Console/Tests/Command/InvokableCommandTest.php @@ -21,7 +21,9 @@ use Symfony\Component\Console\Exception\InvalidOptionException; use Symfony\Component\Console\Exception\LogicException; use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\NullOutput; +use Symfony\Component\Console\Output\OutputInterface; class InvokableCommandTest extends TestCase { @@ -29,7 +31,7 @@ public function testCommandInputArgumentDefinition() { $command = new Command('foo'); $command->setCode(function ( - #[Argument(name: 'first-name')] string $name, + #[Argument(name: 'very-first-name')] string $name, #[Argument] ?string $firstName, #[Argument] string $lastName = '', #[Argument(description: 'Short argument description')] string $bio = '', @@ -38,17 +40,17 @@ public function testCommandInputArgumentDefinition() return 0; }); - $nameInputArgument = $command->getDefinition()->getArgument('first-name'); - self::assertSame('first-name', $nameInputArgument->getName()); + $nameInputArgument = $command->getDefinition()->getArgument('very-first-name'); + self::assertSame('very-first-name', $nameInputArgument->getName()); self::assertTrue($nameInputArgument->isRequired()); - $lastNameInputArgument = $command->getDefinition()->getArgument('firstName'); - self::assertSame('firstName', $lastNameInputArgument->getName()); + $lastNameInputArgument = $command->getDefinition()->getArgument('first-name'); + self::assertSame('first-name', $lastNameInputArgument->getName()); self::assertFalse($lastNameInputArgument->isRequired()); self::assertNull($lastNameInputArgument->getDefault()); - $lastNameInputArgument = $command->getDefinition()->getArgument('lastName'); - self::assertSame('lastName', $lastNameInputArgument->getName()); + $lastNameInputArgument = $command->getDefinition()->getArgument('last-name'); + self::assertSame('last-name', $lastNameInputArgument->getName()); self::assertFalse($lastNameInputArgument->isRequired()); self::assertSame('', $lastNameInputArgument->getDefault()); @@ -77,6 +79,7 @@ public function testCommandInputOptionDefinition() #[Option(shortcut: 'v')] bool $verbose = false, #[Option(description: 'User groups')] array $groups = [], #[Option(suggestedValues: [self::class, 'getSuggestedRoles'])] array $roles = ['ROLE_USER'], + #[Option] string|bool $opt = false, ): int { return 0; }); @@ -84,7 +87,8 @@ public function testCommandInputOptionDefinition() $timeoutInputOption = $command->getDefinition()->getOption('idle'); self::assertSame('idle', $timeoutInputOption->getName()); self::assertNull($timeoutInputOption->getShortcut()); - self::assertTrue($timeoutInputOption->isValueOptional()); + self::assertTrue($timeoutInputOption->isValueRequired()); + self::assertFalse($timeoutInputOption->isValueOptional()); self::assertFalse($timeoutInputOption->isNegatable()); self::assertNull($timeoutInputOption->getDefault()); @@ -118,6 +122,14 @@ public function testCommandInputOptionDefinition() self::assertTrue($rolesInputOption->hasCompletion()); $rolesInputOption->complete(new CompletionInput(), $suggestions = new CompletionSuggestions()); self::assertSame(['ROLE_ADMIN', 'ROLE_USER'], array_map(static fn (Suggestion $s) => $s->getValue(), $suggestions->getValueSuggestions())); + + $optInputOption = $command->getDefinition()->getOption('opt'); + self::assertSame('opt', $optInputOption->getName()); + self::assertNull($optInputOption->getShortcut()); + self::assertFalse($optInputOption->isValueRequired()); + self::assertTrue($optInputOption->isValueOptional()); + self::assertFalse($optInputOption->isNegatable()); + self::assertFalse($optInputOption->getDefault()); } public function testInvalidArgumentType() @@ -126,7 +138,6 @@ public function testInvalidArgumentType() $command->setCode(function (#[Argument] object $any) {}); $this->expectException(LogicException::class); - $this->expectExceptionMessage('The type "object" of parameter "$any" is not supported as a command argument. Only "string", "bool", "int", "float", "array" types are allowed.'); $command->getDefinition(); } @@ -134,14 +145,52 @@ public function testInvalidArgumentType() public function testInvalidOptionType() { $command = new Command('foo'); - $command->setCode(function (#[Option] object $any) {}); + $command->setCode(function (#[Option] ?object $any = null) {}); $this->expectException(LogicException::class); - $this->expectExceptionMessage('The type "object" of parameter "$any" is not supported as a command option. Only "string", "bool", "int", "float", "array" types are allowed.'); $command->getDefinition(); } + public function testExecuteHasPriorityOverInvokeMethod() + { + $command = new class extends Command { + public string $called; + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->called = __FUNCTION__; + + return 0; + } + + public function __invoke(): int + { + $this->called = __FUNCTION__; + + return 0; + } + }; + + $command->run(new ArrayInput([]), new NullOutput()); + $this->assertSame('execute', $command->called); + } + + public function testCallInvokeMethodWhenExtendingCommandClass() + { + $command = new class extends Command { + public string $called; + public function __invoke(): int + { + $this->called = __FUNCTION__; + + return 0; + } + }; + + $command->run(new ArrayInput([]), new NullOutput()); + $this->assertSame('__invoke', $command->called); + } + public function testInvalidReturnType() { $command = new Command('foo'); @@ -220,13 +269,31 @@ public function testNonBinaryInputOptions(array $parameters, array $expected) { $command = new Command('foo'); $command->setCode(function ( - #[Option] ?string $a = null, - #[Option] ?string $b = 'b', - #[Option] ?array $c = [], + #[Option] string $a = '', + #[Option] array $b = [], + #[Option] array $c = ['a', 'b'], + #[Option] bool|string $d = false, + #[Option] ?string $e = null, + #[Option] ?array $f = null, + #[Option] int $g = 0, + #[Option] ?int $h = null, + #[Option] float $i = 0.0, + #[Option] ?float $j = null, + #[Option] bool|int $k = false, + #[Option] bool|float $l = false, ) use ($expected): int { $this->assertSame($expected[0], $a); $this->assertSame($expected[1], $b); $this->assertSame($expected[2], $c); + $this->assertSame($expected[3], $d); + $this->assertSame($expected[4], $e); + $this->assertSame($expected[5], $f); + $this->assertSame($expected[6], $g); + $this->assertSame($expected[7], $h); + $this->assertSame($expected[8], $i); + $this->assertSame($expected[9], $j); + $this->assertSame($expected[10], $k); + $this->assertSame($expected[11], $l); return 0; }); @@ -236,22 +303,64 @@ public function testNonBinaryInputOptions(array $parameters, array $expected) public static function provideNonBinaryInputOptions(): \Generator { - yield 'defaults' => [[], [null, 'b', []]]; - yield 'with-value' => [['--a' => 'x', '--b' => 'y', '--c' => ['z']], ['x', 'y', ['z']]]; - yield 'without-value' => [['--a' => null, '--b' => null, '--c' => null], [null, null, null]]; + yield 'defaults' => [ + [], + ['', [], ['a', 'b'], false, null, null, 0, null, 0.0, null, false, false], + ]; + yield 'with-value' => [ + ['--a' => 'x', '--b' => ['z'], '--c' => ['c', 'd'], '--d' => 'v', '--e' => 'w', '--f' => ['q'], '--g' => 1, '--h' => 2, '--i' => 3.1, '--j' => 4.2, '--k' => 5, '--l' => 6.3], + ['x', ['z'], ['c', 'd'], 'v', 'w', ['q'], 1, 2, 3.1, 4.2, 5, 6.3], + ]; + yield 'without-value' => [ + ['--d' => null, '--k' => null, '--l' => null], + ['', [], ['a', 'b'], true, null, null, 0, null, 0.0, null, true, true], + ]; } - public function testInvalidOptionDefinition() + /** + * @dataProvider provideInvalidOptionDefinitions + */ + public function testInvalidOptionDefinition(callable $code) { $command = new Command('foo'); - $command->setCode(function (#[Option] string $a) {}); + $command->setCode($code); $this->expectException(LogicException::class); - $this->expectExceptionMessage('The option parameter "$a" must declare a default value.'); $command->getDefinition(); } + public static function provideInvalidOptionDefinitions(): \Generator + { + yield 'no-default' => [ + function (#[Option] string $a) {} + ]; + yield 'nullable-bool-default-true' => [ + function (#[Option] ?bool $a = true) {} + ]; + yield 'nullable-bool-default-false' => [ + function (#[Option] ?bool $a = false) {} + ]; + yield 'invalid-union-type' => [ + function (#[Option] array|bool $a = false) {} + ]; + yield 'union-type-cannot-allow-null' => [ + function (#[Option] string|bool|null $a = null) {}, + ]; + yield 'union-type-default-true' => [ + function (#[Option] string|bool $a = true) {}, + ]; + yield 'union-type-default-string' => [ + function (#[Option] string|bool $a = 'foo') {}, + ]; + yield 'nullable-string-not-null-default' => [ + function (#[Option] ?string $a = 'foo') {}, + ]; + yield 'nullable-array-not-null-default' => [ + function (#[Option] ?array $a = []) {}, + ]; + } + public function testInvalidRequiredValueOptionEvenWithDefault() { $command = new Command('foo'); diff --git a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php index 8a0c1e6b2bbf5..9ac660100ea0d 100644 --- a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php +++ b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php @@ -15,6 +15,7 @@ use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\LazyCommand; +use Symfony\Component\Console\Command\SignalableCommandInterface; use Symfony\Component\Console\CommandLoader\ContainerCommandLoader; use Symfony\Component\Console\DependencyInjection\AddConsoleCommandPass; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; @@ -325,6 +326,27 @@ public function testProcessInvokableCommand() self::assertSame('The command description', $command->getDescription()); self::assertSame('The %command.name% command help content.', $command->getHelp()); } + + public function testProcessInvokableSignalableCommand() + { + $container = new ContainerBuilder(); + $container->addCompilerPass(new AddConsoleCommandPass(), PassConfig::TYPE_BEFORE_REMOVING); + + $definition = new Definition(InvokableSignalableCommand::class); + $definition->addTag('console.command', [ + 'command' => 'invokable-signalable', + 'description' => 'The command description', + 'help' => 'The %command.name% command help content.', + ]); + $container->setDefinition('invokable_signalable_command', $definition); + + $container->compile(); + $command = $container->get('console.command_loader')->get('invokable-signalable'); + + self::assertTrue($container->has('invokable_signalable_command.command')); + self::assertSame('The command description', $command->getDescription()); + self::assertSame('The %command.name% command help content.', $command->getHelp()); + } } class MyCommand extends Command @@ -361,3 +383,21 @@ public function __invoke(): void { } } + +#[AsCommand(name: 'invokable-signalable', description: 'Just testing', help: 'The %command.name% help content.')] +class InvokableSignalableCommand implements SignalableCommandInterface +{ + public function __invoke(): void + { + } + + public function getSubscribedSignals(): array + { + return []; + } + + public function handleSignal(int $signal, false|int $previousExitCode = 0): int|false + { + return false; + } +} diff --git a/src/Symfony/Component/Console/Tests/Fixtures/application_signalable.php b/src/Symfony/Component/Console/Tests/Fixtures/application_signalable.php index c737ba1bf79c7..cc1bae6acdf7f 100644 --- a/src/Symfony/Component/Console/Tests/Fixtures/application_signalable.php +++ b/src/Symfony/Component/Console/Tests/Fixtures/application_signalable.php @@ -1,6 +1,5 @@ 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/phpt/alarm/command_exit.phpt b/src/Symfony/Component/Console/Tests/phpt/alarm/command_exit.phpt index d3015ad9dbcf6..c2cf3edc7d1c0 100644 --- a/src/Symfony/Component/Console/Tests/phpt/alarm/command_exit.phpt +++ b/src/Symfony/Component/Console/Tests/phpt/alarm/command_exit.phpt @@ -7,7 +7,6 @@ Test command that exits use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\SignalableCommandInterface; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -19,7 +18,7 @@ while (!file_exists($vendor.'/vendor')) { } require $vendor.'/vendor/autoload.php'; -class MyCommand extends Command implements SignalableCommandInterface +class MyCommand extends Command { protected function initialize(InputInterface $input, OutputInterface $output): void { diff --git a/src/Symfony/Component/Console/Tests/phpt/signal/command_exit.phpt b/src/Symfony/Component/Console/Tests/phpt/signal/command_exit.phpt index 379476189d4b4..e14f80c47afee 100644 --- a/src/Symfony/Component/Console/Tests/phpt/signal/command_exit.phpt +++ b/src/Symfony/Component/Console/Tests/phpt/signal/command_exit.phpt @@ -7,7 +7,6 @@ Test command that exits use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\SignalableCommandInterface; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -19,7 +18,7 @@ while (!file_exists($vendor.'/vendor')) { } require $vendor.'/vendor/autoload.php'; -class MyCommand extends Command implements SignalableCommandInterface +class MyCommand extends Command { protected function execute(InputInterface $input, OutputInterface $output): int { diff --git a/src/Symfony/Component/Console/composer.json b/src/Symfony/Component/Console/composer.json index 6247ee94e9a1d..65d69913aa218 100644 --- a/src/Symfony/Component/Console/composer.json +++ b/src/Symfony/Component/Console/composer.json @@ -20,7 +20,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "require-dev": { "symfony/config": "^6.4|^7.0", @@ -43,8 +43,7 @@ "symfony/dotenv": "<6.4", "symfony/event-dispatcher": "<6.4", "symfony/lock": "<6.4", - "symfony/process": "<6.4", - "symfony/runtime": "<7.3" + "symfony/process": "<6.4" }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" }, diff --git a/src/Symfony/Component/DependencyInjection/Attribute/AsAlias.php b/src/Symfony/Component/DependencyInjection/Attribute/AsAlias.php index 2f03e5fcdf4e2..0839afa48ff44 100644 --- a/src/Symfony/Component/DependencyInjection/Attribute/AsAlias.php +++ b/src/Symfony/Component/DependencyInjection/Attribute/AsAlias.php @@ -20,12 +20,20 @@ final class AsAlias { /** - * @param string|null $id The id of the alias - * @param bool $public Whether to declare the alias public + * @var list + */ + public array $when = []; + + /** + * @param string|null $id The id of the alias + * @param bool $public Whether to declare the alias public + * @param string|list $when The environments under which the class will be registered as a service (i.e. "dev", "test", "prod") */ public function __construct( public ?string $id = null, public bool $public = false, + string|array $when = [], ) { + $this->when = (array) $when; } } diff --git a/src/Symfony/Component/DependencyInjection/Attribute/AsTaggedItem.php b/src/Symfony/Component/DependencyInjection/Attribute/AsTaggedItem.php index cc3306c739638..de751213acad5 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/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index 07521bc863e42..df3486a9dc867 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -11,6 +11,7 @@ CHANGELOG for auto-configuration of classes excluded from the service container * Accept multiple auto-configuration callbacks for the same attribute class * Leverage native lazy objects when possible for lazy services + * Add `when` argument to `#[AsAlias]` 7.2 --- 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/PriorityTaggedServiceTrait.php b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php index 4befef860a66e..8c6b5b582770d 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php @@ -88,8 +88,7 @@ private function findAndSortTaggedServices(string|TaggedIteratorArgument $tagNam if (null === $index && null === $defaultIndex && $defaultPriorityMethod && $reflector) { $defaultIndex = PriorityTaggedServiceUtil::getDefault($serviceId, $reflector, $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/ResolveInstanceofConditionalsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php index 90d4569c42bc4..52dc56c0f371b 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php @@ -112,8 +112,8 @@ private function processDefinition(ContainerBuilder $container, string $id, Defi $definition = substr_replace($definition, '53', 2, 2); $definition = substr_replace($definition, 'Child', 44, 0); } - /** @var ChildDefinition $definition */ $definition = unserialize($definition); + /** @var ChildDefinition $definition */ $definition->setParent($parent); if (null !== $shared && !isset($definition->getChanges()['shared'])) { @@ -149,6 +149,11 @@ private function processDefinition(ContainerBuilder $container, string $id, Defi ->setAbstract(true); } + if ($definition->isSynthetic()) { + // Ignore container.excluded tag on synthetic services + $definition->clearTag('container.excluded'); + } + return $definition; } 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/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 47202cf7d9e9a..0389003d20856 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -790,10 +790,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/ContainerInterface.php b/src/Symfony/Component/DependencyInjection/ContainerInterface.php index 39fd080c336c3..6d6f6d3bf0bfe 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerInterface.php +++ b/src/Symfony/Component/DependencyInjection/ContainerInterface.php @@ -33,11 +33,13 @@ interface ContainerInterface extends PsrContainerInterface public function set(string $id, ?object $service): void; /** + * @template C of object * @template B of self::*_REFERENCE * - * @param B $invalidBehavior + * @param string|class-string $id + * @param B $invalidBehavior * - * @psalm-return (B is self::EXCEPTION_ON_INVALID_REFERENCE|self::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE ? object : object|null) + * @return ($id is class-string ? (B is 0|1 ? C|object : C|object|null) : (B is 0|1 ? object : object|null)) * * @throws ServiceCircularReferenceException When a circular reference is detected * @throws ServiceNotFoundException When the service is not defined 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/Loader/FileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php index 9e17bc424a2a9..bc38767bcb546 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php @@ -224,10 +224,14 @@ public function registerClasses(Definition $prototype, string $namespace, string if (null === $alias) { throw new LogicException(\sprintf('Alias cannot be automatically determined for class "%s". If you have used the #[AsAlias] attribute with a class implementing multiple interfaces, add the interface you want to alias to the first parameter of #[AsAlias].', $class)); } - if (isset($this->aliases[$alias])) { - throw new LogicException(\sprintf('The "%s" alias has already been defined with the #[AsAlias] attribute in "%s".', $alias, $this->aliases[$alias])); + + if (!$attribute->when || \in_array($this->env, $attribute->when, true)) { + if (isset($this->aliases[$alias])) { + throw new LogicException(\sprintf('The "%s" alias has already been defined with the #[AsAlias] attribute in "%s".', $alias, $this->aliases[$alias])); + } + + $this->aliases[$alias] = new Alias($class, $public); } - $this->aliases[$alias] = new Alias($class, $public); } } 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/ResolveInstanceofConditionalsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php index 76143fc9b91cb..b4e50d39f2eae 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInstanceofConditionalsPassTest.php @@ -376,6 +376,21 @@ public function testDecoratorsKeepBehaviorDescribingTags() ], $container->getDefinition('decorator')->getTags()); $this->assertFalse($container->hasParameter('container.behavior_describing_tags')); } + + public function testSyntheticService() + { + $container = new ContainerBuilder(); + $container->register('kernel', \stdClass::class) + ->setInstanceofConditionals([ + \stdClass::class => (new ChildDefinition('')) + ->addTag('container.excluded'), + ]) + ->setSynthetic(true); + + (new ResolveInstanceofConditionalsPass())->process($container); + + $this->assertSame([], $container->getDefinition('kernel')->getTags()); + } } class DecoratorWithBehavior implements ResetInterface, ResourceCheckerInterface, ServiceSubscriberInterface 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/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/PrototypeAsAlias/WithAsAliasBothEnv.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/PrototypeAsAlias/WithAsAliasBothEnv.php new file mode 100644 index 0000000000000..252842be35ff2 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/PrototypeAsAlias/WithAsAliasBothEnv.php @@ -0,0 +1,10 @@ +registerClasses( (new Definition())->setAutoconfigured(true), 'Symfony\Component\DependencyInjection\Tests\Fixtures\PrototypeAsAlias\\', @@ -374,6 +377,15 @@ public static function provideResourcesWithAsAliasAttributes(): iterable AliasBarInterface::class => new Alias(WithAsAliasIdMultipleInterface::class), AliasFooInterface::class => new Alias(WithAsAliasIdMultipleInterface::class), ]]; + yield 'Dev-env specific' => ['PrototypeAsAlias/WithAsAlias*Env.php', [ + AliasFooInterface::class => new Alias(WithAsAliasDevEnv::class), + AliasBarInterface::class => new Alias(WithAsAliasBothEnv::class), + ], 'dev']; + yield 'Prod-env specific' => ['PrototypeAsAlias/WithAsAlias*Env.php', [ + AliasFooInterface::class => new Alias(WithAsAliasProdEnv::class), + AliasBarInterface::class => new Alias(WithAsAliasBothEnv::class), + ], 'prod']; + yield 'Test-env specific' => ['PrototypeAsAlias/WithAsAlias*Env.php', [], 'test']; } /** diff --git a/src/Symfony/Component/DomCrawler/Crawler.php b/src/Symfony/Component/DomCrawler/Crawler.php index e41875e268203..7550da83d4fdb 100644 --- a/src/Symfony/Component/DomCrawler/Crawler.php +++ b/src/Symfony/Component/DomCrawler/Crawler.php @@ -747,12 +747,12 @@ public function selectImage(string $value): static } /** - * Selects a button by name or alt value for images. + * Selects a button by its text content, id, value, name or alt attribute. */ public function selectButton(string $value): static { return $this->filterRelativeXPath( - \sprintf('descendant-or-self::input[((contains(%1$s, "submit") or contains(%1$s, "button")) and contains(concat(\' \', normalize-space(string(@value)), \' \'), %2$s)) or (contains(%1$s, "image") and contains(concat(\' \', normalize-space(string(@alt)), \' \'), %2$s)) or @id=%3$s or @name=%3$s] | descendant-or-self::button[contains(concat(\' \', normalize-space(string(.)), \' \'), %2$s) or @id=%3$s or @name=%3$s]', 'translate(@type, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")', static::xpathLiteral(' '.$value.' '), static::xpathLiteral($value)) + \sprintf('descendant-or-self::input[((contains(%1$s, "submit") or contains(%1$s, "button")) and contains(concat(\' \', normalize-space(string(@value)), \' \'), %2$s)) or (contains(%1$s, "image") and contains(concat(\' \', normalize-space(string(@alt)), \' \'), %2$s)) or @id=%3$s or @name=%3$s] | descendant-or-self::button[contains(concat(\' \', normalize-space(string(.)), \' \'), %2$s) or contains(concat(\' \', normalize-space(string(@value)), \' \'), %2$s) or @id=%3$s or @name=%3$s]', 'translate(@type, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")', static::xpathLiteral(' '.$value.' '), static::xpathLiteral($value)) ); } diff --git a/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php b/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php index 5cdbbbf45870d..53169efcab8e5 100644 --- a/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php +++ b/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php @@ -452,10 +452,10 @@ public function testFilterXpathComplexQueries() $this->assertCount(0, $crawler->filterXPath('/body')); $this->assertCount(1, $crawler->filterXPath('./body')); $this->assertCount(1, $crawler->filterXPath('.//body')); - $this->assertCount(5, $crawler->filterXPath('.//input')); + $this->assertCount(6, $crawler->filterXPath('.//input')); $this->assertCount(4, $crawler->filterXPath('//form')->filterXPath('//button | //input')); $this->assertCount(1, $crawler->filterXPath('body')); - $this->assertCount(6, $crawler->filterXPath('//button | //input')); + $this->assertCount(8, $crawler->filterXPath('//button | //input')); $this->assertCount(1, $crawler->filterXPath('//body')); $this->assertCount(1, $crawler->filterXPath('descendant-or-self::body')); $this->assertCount(1, $crawler->filterXPath('//div[@id="parent"]')->filterXPath('./div'), 'A child selection finds only the current div'); @@ -723,16 +723,23 @@ public function testSelectButton() $this->assertNotSame($crawler, $crawler->selectButton('FooValue'), '->selectButton() returns a new instance of a crawler'); $this->assertInstanceOf(Crawler::class, $crawler->selectButton('FooValue'), '->selectButton() returns a new instance of a crawler'); - $this->assertEquals(1, $crawler->selectButton('FooValue')->count(), '->selectButton() selects buttons'); - $this->assertEquals(1, $crawler->selectButton('FooName')->count(), '->selectButton() selects buttons'); - $this->assertEquals(1, $crawler->selectButton('FooId')->count(), '->selectButton() selects buttons'); + $this->assertCount(1, $crawler->selectButton('FooValue'), '->selectButton() selects type-submit inputs by value'); + $this->assertCount(1, $crawler->selectButton('FooName'), '->selectButton() selects type-submit inputs by name'); + $this->assertCount(1, $crawler->selectButton('FooId'), '->selectButton() selects type-submit inputs by id'); - $this->assertEquals(1, $crawler->selectButton('BarValue')->count(), '->selectButton() selects buttons'); - $this->assertEquals(1, $crawler->selectButton('BarName')->count(), '->selectButton() selects buttons'); - $this->assertEquals(1, $crawler->selectButton('BarId')->count(), '->selectButton() selects buttons'); + $this->assertCount(1, $crawler->selectButton('BarValue'), '->selectButton() selects type-button inputs by value'); + $this->assertCount(1, $crawler->selectButton('BarName'), '->selectButton() selects type-button inputs by name'); + $this->assertCount(1, $crawler->selectButton('BarId'), '->selectButton() selects type-button inputs by id'); - $this->assertEquals(1, $crawler->selectButton('FooBarValue')->count(), '->selectButton() selects buttons with form attribute too'); - $this->assertEquals(1, $crawler->selectButton('FooBarName')->count(), '->selectButton() selects buttons with form attribute too'); + $this->assertCount(1, $crawler->selectButton('ImageAlt'), '->selectButton() selects type-image inputs by alt'); + + $this->assertCount(1, $crawler->selectButton('ButtonValue'), '->selectButton() selects buttons by value'); + $this->assertCount(1, $crawler->selectButton('ButtonName'), '->selectButton() selects buttons by name'); + $this->assertCount(1, $crawler->selectButton('ButtonId'), '->selectButton() selects buttons by id'); + $this->assertCount(1, $crawler->selectButton('ButtonText'), '->selectButton() selects buttons by text content'); + + $this->assertCount(1, $crawler->selectButton('FooBarValue'), '->selectButton() selects buttons with form attribute too'); + $this->assertCount(1, $crawler->selectButton('FooBarName'), '->selectButton() selects buttons with form attribute too'); } public function testSelectButtonWithSingleQuotesInNameAttribute() @@ -1322,6 +1329,9 @@ public function createTestCrawler($uri = null) + + +
  • One
  • Two
  • 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:', + '👩🏼‍❤️‍👩🏽' => ':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:', + '🧑‍🧑‍🧒‍🧒' => ':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:', + '👨🏽‍🏭' => ':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:', + '🧑‍🎨' => ':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:', '🐘' => ':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:', '👩‍🦽‍➡️' => ':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:', '🚶‍♀️' => ':woman-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:', '🤜🏼' => ':right-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:' => '🌸', ':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:' => '🕒', @@ -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:' => '🥷🏿', + ':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:' => '🧛🏼‍♂️', + ':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-heart-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:' => '🫸🏼', + ':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-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:' => '👰🏽‍♀️', ':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-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-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/Debug.php b/src/Symfony/Component/ErrorHandler/Debug.php index d54a38c4cac12..b090040d024b4 100644 --- a/src/Symfony/Component/ErrorHandler/Debug.php +++ b/src/Symfony/Component/ErrorHandler/Debug.php @@ -20,7 +20,7 @@ class Debug { public static function enable(): ErrorHandler { - error_reporting(-1); + error_reporting(\E_ALL & ~\E_DEPRECATED & ~\E_USER_DEPRECATED); if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { ini_set('display_errors', 0); 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/EventDispatcher/Debug/TraceableEventDispatcher.php b/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php index 8330ce15e47e9..cd71745ac8935 100644 --- a/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php @@ -43,6 +43,7 @@ public function __construct( protected Stopwatch $stopwatch, protected ?LoggerInterface $logger = null, private ?RequestStack $requestStack = null, + protected readonly ?\Closure $disabled = null, ) { } @@ -103,6 +104,9 @@ public function hasListeners(?string $eventName = null): bool public function dispatch(object $event, ?string $eventName = null): object { + if ($this->disabled?->__invoke()) { + return $this->dispatcher->dispatch($event, $eventName); + } $eventName ??= $event::class; $this->callStack ??= new \SplObjectStorage(); diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php index e9c9cb9e55259..a0b3434a6b828 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/EventListener/ResizeFormListener.php b/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php index 299f919373403..a7da65bdb60fa 100644 --- a/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php +++ b/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php @@ -199,7 +199,13 @@ public function onSubmit(FormEvent $event): void } if ($this->keepAsList) { - $formReindex = []; + $formReindex = $dataKeys = []; + foreach ($data as $key => $value) { + $dataKeys[] = $key; + } + foreach ($dataKeys as $key) { + unset($data[$key]); + } foreach ($form as $name => $child) { $formReindex[] = $child; $form->remove($name); @@ -207,9 +213,9 @@ public function onSubmit(FormEvent $event): void foreach ($formReindex as $index => $child) { $form->add($index, $this->type, array_replace([ 'property_path' => '['.$index.']', - ], $this->options)); + ], $this->options, ['data' => $child->getData()])); + $data[$index] = $child->getData(); } - $data = array_values($data); } $event->setData($data); 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/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/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/Extension/Core/EventListener/ResizeFormListenerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php index 934460c8f98a4..390f6b04a60c5 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php @@ -310,7 +310,7 @@ public function testOnSubmitDealsWithObjectBackedIteratorAggregate() $this->assertArrayNotHasKey(2, $event->getData()); } - public function testOnSubmitDealsWithArrayBackedIteratorAggregate() + public function testOnSubmitDealsWithDoctrineCollection() { $this->builder->add($this->getBuilder('1')); @@ -323,6 +323,19 @@ public function testOnSubmitDealsWithArrayBackedIteratorAggregate() $this->assertArrayNotHasKey(2, $event->getData()); } + public function testKeepAsListWorksWithTraversableArrayAccess() + { + $this->builder->add($this->getBuilder('1')); + + $data = new \ArrayIterator([0 => 'first', 1 => 'second', 2 => 'third']); + $event = new FormEvent($this->builder->getForm(), $data); + $listener = new ResizeFormListener(TextType::class, keepAsList: true); + $listener->onSubmit($event); + + $this->assertCount(1, $event->getData()); + $this->assertArrayHasKey(0, $event->getData()); + } + public function testOnSubmitDeleteEmptyNotCompoundEntriesIfAllowDelete() { $this->builder->setData(['0' => 'first', '1' => 'second']); diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php index 2dec87b5c712c..bd52831e28c3d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php @@ -257,7 +257,7 @@ public function testCollectionTypeKeepAsListOptionTrue() { $formMetadata = new ClassMetadata(Form::class); $authorMetadata = (new ClassMetadata(Author::class)) - ->addPropertyConstraint('firstName', new NotBlank()); + ->addPropertyConstraint('firstName', new Length(1)); $organizationMetadata = (new ClassMetadata(Organization::class)) ->addPropertyConstraint('authors', new Valid()); $metadataFactory = $this->createMock(MetadataFactoryInterface::class); @@ -301,22 +301,22 @@ public function testCollectionTypeKeepAsListOptionTrue() $form->submit([ 'authors' => [ 0 => [ - 'firstName' => '', // Fires a Not Blank Error + 'firstName' => 'foobar', // Fires a Length Error 'lastName' => 'lastName1', ], // key "1" could be missing if we add 4 blank form entries and then remove it. 2 => [ - 'firstName' => '', // Fires a Not Blank Error + 'firstName' => 'barfoo', // Fires a Length Error 'lastName' => 'lastName3', ], 3 => [ - 'firstName' => '', // Fires a Not Blank Error + 'firstName' => 'barbaz', // Fires a Length Error 'lastName' => 'lastName3', ], ], ]); - // Form does have 3 not blank errors + // Form does have 3 length errors $errors = $form->getErrors(true); $this->assertCount(3, $errors); @@ -328,12 +328,15 @@ public function testCollectionTypeKeepAsListOptionTrue() ]; $this->assertTrue($form->get('authors')->has('0')); + $this->assertSame('foobar', $form->get('authors')->get('0')->getData()->firstName); $this->assertContains('data.authors[0].firstName', $errorPaths); $this->assertTrue($form->get('authors')->has('1')); + $this->assertSame('barfoo', $form->get('authors')->get('1')->getData()->firstName); $this->assertContains('data.authors[1].firstName', $errorPaths); $this->assertTrue($form->get('authors')->has('2')); + $this->assertSame('barbaz', $form->get('authors')->get('2')->getData()->firstName); $this->assertContains('data.authors[2].firstName', $errorPaths); $this->assertFalse($form->get('authors')->has('3')); 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/HttpClient/AmpHttpClient.php b/src/Symfony/Component/HttpClient/AmpHttpClient.php index 4c73fbaf3db24..0bfa824a9a9a5 100644 --- a/src/Symfony/Component/HttpClient/AmpHttpClient.php +++ b/src/Symfony/Component/HttpClient/AmpHttpClient.php @@ -33,7 +33,7 @@ use Symfony\Contracts\Service\ResetInterface; if (!interface_exists(DelegateHttpClient::class)) { - throw new \LogicException('You cannot use "Symfony\Component\HttpClient\AmpHttpClient" as the "amphp/http-client" package is not installed. Try running "composer require amphp/http-client:^4.2.1".'); + throw new \LogicException('You cannot use "Symfony\Component\HttpClient\AmpHttpClient" as the "amphp/http-client" package is not installed. Try running "composer require amphp/http-client:^5".'); } if (\PHP_VERSION_ID < 80400 && is_subclass_of(Request::class, HttpMessage::class)) { diff --git a/src/Symfony/Component/HttpClient/DependencyInjection/HttpClientPass.php b/src/Symfony/Component/HttpClient/DependencyInjection/HttpClientPass.php index 214a655bc6992..2888d2e5c15b2 100644 --- a/src/Symfony/Component/HttpClient/DependencyInjection/HttpClientPass.php +++ b/src/Symfony/Component/HttpClient/DependencyInjection/HttpClientPass.php @@ -27,7 +27,7 @@ public function process(ContainerBuilder $container): void foreach ($container->findTaggedServiceIds('http_client.client') as $id => $tags) { $container->register('.debug.'.$id, TraceableHttpClient::class) - ->setArguments([new Reference('.debug.'.$id.'.inner'), new Reference('debug.stopwatch', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)]) + ->setArguments([new Reference('.debug.'.$id.'.inner'), new Reference('debug.stopwatch', ContainerInterface::IGNORE_ON_INVALID_REFERENCE), new Reference('profiler.is_disabled_state_checker', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)]) ->addTag('kernel.reset', ['method' => 'reset']) ->setDecoratedService($id, null, 5); $container->getDefinition('data_collector.http_client') diff --git a/src/Symfony/Component/HttpClient/HttpClient.php b/src/Symfony/Component/HttpClient/HttpClient.php index 3eb3665614fd7..27659358bce4c 100644 --- a/src/Symfony/Component/HttpClient/HttpClient.php +++ b/src/Symfony/Component/HttpClient/HttpClient.php @@ -62,7 +62,7 @@ public static function create(array $defaultOptions = [], int $maxHostConnection return new AmpHttpClient($defaultOptions, null, $maxHostConnections, $maxPendingPushes); } - @trigger_error((\extension_loaded('curl') ? 'Upgrade' : 'Install').' the curl extension or run "composer require amphp/http-client:^4.2.1" to perform async HTTP operations, including full HTTP/2 support', \E_USER_NOTICE); + @trigger_error((\extension_loaded('curl') ? 'Upgrade' : 'Install').' the curl extension or run "composer require amphp/http-client:^5" to perform async HTTP operations, including full HTTP/2 support', \E_USER_NOTICE); return new NativeHttpClient($defaultOptions, $maxHostConnections); } diff --git a/src/Symfony/Component/HttpClient/Response/CurlResponse.php b/src/Symfony/Component/HttpClient/Response/CurlResponse.php index e35132d41cccc..8ff8586553d2d 100644 --- a/src/Symfony/Component/HttpClient/Response/CurlResponse.php +++ b/src/Symfony/Component/HttpClient/Response/CurlResponse.php @@ -126,9 +126,14 @@ public function __construct( curl_setopt($ch, \CURLOPT_NOPROGRESS, false); curl_setopt($ch, \CURLOPT_PROGRESSFUNCTION, static function ($ch, $dlSize, $dlNow) use ($onProgress, &$info, $url, $multi, $debugBuffer) { try { + $info['debug'] ??= ''; rewind($debugBuffer); - $debug = ['debug' => stream_get_contents($debugBuffer)]; - $onProgress($dlNow, $dlSize, $url + curl_getinfo($ch) + $info + $debug); + if (fstat($debugBuffer)['size']) { + $info['debug'] .= stream_get_contents($debugBuffer); + rewind($debugBuffer); + ftruncate($debugBuffer, 0); + } + $onProgress($dlNow, $dlSize, $url + curl_getinfo($ch) + $info); } catch (\Throwable $e) { $multi->handlesActivity[(int) $ch][] = null; $multi->handlesActivity[(int) $ch][] = $e; @@ -200,7 +205,6 @@ public function getInfo(?string $type = null): mixed { if (!$info = $this->finalInfo) { $info = array_merge($this->info, curl_getinfo($this->handle)); - $info['url'] = $this->info['url'] ?? $info['url']; $info['redirect_url'] = $this->info['redirect_url'] ?? null; // workaround curl not subtracting the time offset for pushed responses @@ -209,14 +213,18 @@ public function getInfo(?string $type = null): mixed $info['starttransfer_time'] = 0.0; } + $info['debug'] ??= ''; rewind($this->debugBuffer); - $info['debug'] = stream_get_contents($this->debugBuffer); + if (fstat($this->debugBuffer)['size']) { + $info['debug'] .= stream_get_contents($this->debugBuffer); + rewind($this->debugBuffer); + ftruncate($this->debugBuffer, 0); + } + $this->info = array_merge($this->info, $info); $waitFor = curl_getinfo($this->handle, \CURLINFO_PRIVATE); if ('H' !== $waitFor[0] && 'C' !== $waitFor[0]) { curl_setopt($this->handle, \CURLOPT_VERBOSE, false); - rewind($this->debugBuffer); - ftruncate($this->debugBuffer, 0); $this->finalInfo = $info; } } diff --git a/src/Symfony/Component/HttpClient/Response/TraceableResponse.php b/src/Symfony/Component/HttpClient/Response/TraceableResponse.php index c8a796d6e94a0..f7d402eb9c6ee 100644 --- a/src/Symfony/Component/HttpClient/Response/TraceableResponse.php +++ b/src/Symfony/Component/HttpClient/Response/TraceableResponse.php @@ -34,7 +34,7 @@ class TraceableResponse implements ResponseInterface, StreamableInterface public function __construct( private HttpClientInterface $client, private ResponseInterface $response, - private mixed &$content, + private mixed &$content = false, private ?StopwatchEvent $event = null, ) { } diff --git a/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php b/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php index 1d6f941c5b9b3..e4c8a4a52cfd1 100644 --- a/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php +++ b/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php @@ -30,6 +30,7 @@ trait TransportResponseTrait { private Canary $canary; + /** @var array> */ private array $headers = []; private array $info = [ 'response_headers' => [], diff --git a/src/Symfony/Component/HttpClient/TraceableHttpClient.php b/src/Symfony/Component/HttpClient/TraceableHttpClient.php index 83342db58f470..e65a5cc6db0a2 100644 --- a/src/Symfony/Component/HttpClient/TraceableHttpClient.php +++ b/src/Symfony/Component/HttpClient/TraceableHttpClient.php @@ -31,15 +31,20 @@ final class TraceableHttpClient implements HttpClientInterface, ResetInterface, public function __construct( private HttpClientInterface $client, private ?Stopwatch $stopwatch = null, + private ?\Closure $disabled = null, ) { $this->tracedRequests = new \ArrayObject(); } public function request(string $method, string $url, array $options = []): ResponseInterface { + if ($this->disabled?->__invoke()) { + return new TraceableResponse($this->client, $this->client->request($method, $url, $options)); + } + $content = null; $traceInfo = []; - $this->tracedRequests[] = [ + $tracedRequest = [ 'method' => $method, 'url' => $url, 'options' => $options, @@ -51,7 +56,9 @@ public function request(string $method, string $url, array $options = []): Respo if (false === ($options['extra']['trace_content'] ?? true)) { unset($content); $content = false; + unset($tracedRequest['options']['body'], $tracedRequest['options']['json']); } + $this->tracedRequests[] = $tracedRequest; $options['on_progress'] = function (int $dlNow, int $dlSize, array $info) use (&$traceInfo, $onProgress) { $traceInfo = $info; diff --git a/src/Symfony/Component/HttpClient/composer.json b/src/Symfony/Component/HttpClient/composer.json index 7ca008fd01f13..39e43f50b4fcd 100644 --- a/src/Symfony/Component/HttpClient/composer.json +++ b/src/Symfony/Component/HttpClient/composer.json @@ -31,7 +31,6 @@ "require-dev": { "amphp/http-client": "^4.2.1|^5.0", "amphp/http-tunnel": "^1.0|^2.0", - "amphp/socket": "^1.1", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", @@ -46,6 +45,7 @@ }, "conflict": { "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", "symfony/http-foundation": "<6.4" }, diff --git a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php index 2c4d831bb9afa..a7358183bd461 100644 --- a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php +++ b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php @@ -237,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/CHANGELOG.md b/src/Symfony/Component/HttpFoundation/CHANGELOG.md index 59070ee8b307a..374c31889df3c 100644 --- a/src/Symfony/Component/HttpFoundation/CHANGELOG.md +++ b/src/Symfony/Component/HttpFoundation/CHANGELOG.md @@ -7,6 +7,9 @@ CHANGELOG * Add support for iterable of string in `StreamedResponse` * Add `EventStreamResponse` and `ServerEvent` classes to streamline server event streaming * Add support for `valkey:` / `valkeys:` schemes for sessions + * `Request::getPreferredLanguage()` now favors a more preferred language above exactly matching a locale + * Allow `UriSigner` to use a `ClockInterface` + * Add `UriSigner::verify()` 7.2 --- diff --git a/src/Symfony/Component/HttpFoundation/Exception/ExpiredSignedUriException.php b/src/Symfony/Component/HttpFoundation/Exception/ExpiredSignedUriException.php new file mode 100644 index 0000000000000..613e08ef46c63 --- /dev/null +++ b/src/Symfony/Component/HttpFoundation/Exception/ExpiredSignedUriException.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\HttpFoundation\Exception; + +/** + * @author Kevin Bond + */ +final class ExpiredSignedUriException extends SignedUriException +{ + /** + * @internal + */ + public function __construct() + { + parent::__construct('The URI has expired.'); + } +} diff --git a/src/Symfony/Component/HttpFoundation/Exception/SignedUriException.php b/src/Symfony/Component/HttpFoundation/Exception/SignedUriException.php new file mode 100644 index 0000000000000..17b729d315d70 --- /dev/null +++ b/src/Symfony/Component/HttpFoundation/Exception/SignedUriException.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\HttpFoundation\Exception; + +/** + * @author Kevin Bond + */ +abstract class SignedUriException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/src/Symfony/Component/HttpFoundation/Exception/UnsignedUriException.php b/src/Symfony/Component/HttpFoundation/Exception/UnsignedUriException.php new file mode 100644 index 0000000000000..5eabb806b2370 --- /dev/null +++ b/src/Symfony/Component/HttpFoundation/Exception/UnsignedUriException.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\HttpFoundation\Exception; + +/** + * @author Kevin Bond + */ +final class UnsignedUriException extends SignedUriException +{ + /** + * @internal + */ + public function __construct() + { + parent::__construct('The URI is not signed.'); + } +} diff --git a/src/Symfony/Component/HttpFoundation/Exception/UnverifiedSignedUriException.php b/src/Symfony/Component/HttpFoundation/Exception/UnverifiedSignedUriException.php new file mode 100644 index 0000000000000..cc7e98bf2dd3c --- /dev/null +++ b/src/Symfony/Component/HttpFoundation/Exception/UnverifiedSignedUriException.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\HttpFoundation\Exception; + +/** + * @author Kevin Bond + */ +final class UnverifiedSignedUriException extends SignedUriException +{ + /** + * @internal + */ + public function __construct() + { + parent::__construct('The URI signature is invalid.'); + } +} diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index db78105cc83cf..dba930a242672 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]; @@ -1553,10 +1553,6 @@ public function getPreferredLanguage(?array $locales = null): ?string return $locales[0]; } - if ($matches = array_intersect($preferredLanguages, $locales)) { - return current($matches); - } - $combinations = array_merge(...array_map($this->getLanguageCombinations(...), $preferredLanguages)); foreach ($combinations as $combination) { foreach ($locales as $locale) { diff --git a/src/Symfony/Component/HttpFoundation/Response.php b/src/Symfony/Component/HttpFoundation/Response.php index 638b5bf601347..6766f2c77099e 100644 --- a/src/Symfony/Component/HttpFoundation/Response.php +++ b/src/Symfony/Component/HttpFoundation/Response.php @@ -317,6 +317,11 @@ public function sendHeaders(?int $statusCode = null): static { // headers have already been sent by the developer if (headers_sent()) { + if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { + $statusCode ??= $this->statusCode; + header(\sprintf('HTTP/%s %s %s', $this->version, $statusCode, $this->statusText), true, $statusCode); + } + return $this; } diff --git a/src/Symfony/Component/HttpFoundation/StreamedResponse.php b/src/Symfony/Component/HttpFoundation/StreamedResponse.php index 6eedf1c49d2e8..4e755a7cdf07f 100644 --- a/src/Symfony/Component/HttpFoundation/StreamedResponse.php +++ b/src/Symfony/Component/HttpFoundation/StreamedResponse.php @@ -56,6 +56,8 @@ public function setChunks(iterable $chunks): static $this->callback = static function () use ($chunks): void { foreach ($chunks as $chunk) { echo $chunk; + @ob_flush(); + flush(); } }; diff --git a/src/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php b/src/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php index 1263fa39298ff..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'], ]; } 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/ParameterBagTest.php b/src/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php index 5729af2c22fa1..d9ce41146afde 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/RequestTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php index d5a41390e1b5d..5cfb980a7b43b 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'; @@ -1550,16 +1548,16 @@ public static function providePreferredLanguage(): iterable yield '"fr" selected as first choice when no header is present' => ['fr', null, ['fr', 'en']]; yield '"en" selected as first choice when no header is present' => ['en', null, ['en', 'fr']]; yield '"fr_CH" selected as first choice when no header is present' => ['fr_CH', null, ['fr-ch', 'fr-fr']]; - yield '"en_US" is selected as an exact match is found (1)' => ['en_US', 'zh, en-us; q=0.8, en; q=0.6', ['en', 'en-us']]; - yield '"en_US" is selected as an exact match is found (2)' => ['en_US', 'ja-JP,fr_CA;q=0.7,fr;q=0.5,en_US;q=0.3', ['en_US', 'fr_FR']]; - yield '"en" is selected as an exact match is found' => ['en', 'zh, en-us; q=0.8, en; q=0.6', ['fr', 'en']]; - yield '"fr" is selected as an exact match is found' => ['fr', 'zh, en-us; q=0.8, fr-fr; q=0.6, fr; q=0.5', ['fr', 'en']]; + yield '"en_US" is selected as an exact match is found' => ['en_US', 'zh, en-us; q=0.8, en; q=0.6', ['en', 'en-us']]; + yield '"fr_FR" is selected as it has a higher priority than an exact match' => ['fr_FR', 'ja-JP,fr_CA;q=0.7,fr;q=0.5,en_US;q=0.3', ['en_US', 'fr_FR']]; + yield '"en" is selected as an exact match is found (1)' => ['en', 'zh, en-us; q=0.8, en; q=0.6', ['fr', 'en']]; + yield '"en" is selected as an exact match is found (2)' => ['en', 'zh, en-us; q=0.8, fr-fr; q=0.6, fr; q=0.5', ['fr', 'en']]; yield '"en" is selected as "en-us" is a similar dialect' => ['en', 'zh, en-us; q=0.8', ['fr', 'en']]; yield '"fr_FR" is selected as "fr_CA" is a similar dialect (1)' => ['fr_FR', 'ja-JP,fr_CA;q=0.7,fr;q=0.5', ['en_US', 'fr_FR']]; yield '"fr_FR" is selected as "fr_CA" is a similar dialect (2)' => ['fr_FR', 'ja-JP,fr_CA;q=0.7', ['en_US', 'fr_FR']]; - yield '"fr_FR" is selected as "fr" is a similar dialect' => ['fr_FR', 'ja-JP,fr;q=0.5', ['en_US', 'fr_FR']]; + yield '"fr_FR" is selected as "fr" is a similar dialect (1)' => ['fr_FR', 'ja-JP,fr;q=0.5', ['en_US', 'fr_FR']]; + yield '"fr_FR" is selected as "fr" is a similar dialect (2)' => ['fr_FR', 'ja-JP,fr;q=0.5,en_US;q=0.3', ['en_US', 'fr_FR']]; yield '"fr_FR" is selected as "fr_CA" is a similar dialect and has a greater "q" compared to "en_US" (2)' => ['fr_FR', 'ja-JP,fr_CA;q=0.7,ru-ru;q=0.3', ['en_US', 'fr_FR']]; - yield '"en_US" is selected it is an exact match' => ['en_US', 'ja-JP,fr;q=0.5,en_US;q=0.3', ['en_US', 'fr_FR']]; yield '"fr_FR" is selected as "fr_CA" is a similar dialect and has a greater "q" compared to "en"' => ['fr_FR', 'ja-JP,fr_CA;q=0.7,en;q=0.5', ['en_US', 'fr_FR']]; yield '"fr_FR" is selected as is is an exact match as well as "en_US", but with a greater "q" parameter' => ['fr_FR', 'en-us;q=0.5,fr-fr', ['en_US', 'fr_FR']]; yield '"hi_IN" is selected as "hi_Latn_IN" is a similar dialect' => ['hi_IN', 'fr-fr,hi_Latn_IN;q=0.5', ['hi_IN', 'en_US']]; @@ -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/HttpFoundation/Tests/StreamedResponseTest.php b/src/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php index 2a8fe582501a6..fdaee3a35ff6f 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php @@ -30,10 +30,14 @@ public function testConstructorWithChunks() $chunks = ['foo', 'bar', 'baz']; $callback = (new StreamedResponse($chunks))->getCallback(); - ob_start(); + $buffer = ''; + ob_start(function (string $chunk) use (&$buffer) { + $buffer .= $chunk; + }); $callback(); - $this->assertSame('foobarbaz', ob_get_clean()); + ob_get_clean(); + $this->assertSame('foobarbaz', $buffer); } public function testPrepareWith11Protocol() diff --git a/src/Symfony/Component/HttpFoundation/Tests/UriSignerTest.php b/src/Symfony/Component/HttpFoundation/Tests/UriSignerTest.php index 927e2bda84db8..81b35c28e1fc9 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/UriSignerTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/UriSignerTest.php @@ -12,7 +12,11 @@ namespace Symfony\Component\HttpFoundation\Tests; use PHPUnit\Framework\TestCase; +use Symfony\Component\Clock\MockClock; +use Symfony\Component\HttpFoundation\Exception\ExpiredSignedUriException; use Symfony\Component\HttpFoundation\Exception\LogicException; +use Symfony\Component\HttpFoundation\Exception\UnsignedUriException; +use Symfony\Component\HttpFoundation\Exception\UnverifiedSignedUriException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\UriSigner; @@ -199,9 +203,62 @@ public function testCheckWithUriExpiration() $this->assertFalse($signer->check($relativeUriFromNow3)); } + public function testCheckWithUriExpirationWithClock() + { + $clock = new MockClock(); + $signer = new UriSigner('foobar', clock: $clock); + + $this->assertFalse($signer->check($signer->sign('http://example.com/foo', new \DateTimeImmutable('2000-01-01 00:00:00')))); + $this->assertFalse($signer->check($signer->sign('http://example.com/foo?foo=bar', new \DateTimeImmutable('2000-01-01 00:00:00')))); + $this->assertFalse($signer->check($signer->sign('http://example.com/foo?foo=bar&0=integer', new \DateTimeImmutable('2000-01-01 00:00:00')))); + + $this->assertFalse($signer->check($signer->sign('http://example.com/foo', 1577836800))); // 2000-01-01 + $this->assertFalse($signer->check($signer->sign('http://example.com/foo?foo=bar', 1577836800))); // 2000-01-01 + $this->assertFalse($signer->check($signer->sign('http://example.com/foo?foo=bar&0=integer', 1577836800))); // 2000-01-01 + + $relativeUriFromNow1 = $signer->sign('http://example.com/foo', new \DateInterval('PT3S')); + $relativeUriFromNow2 = $signer->sign('http://example.com/foo?foo=bar', new \DateInterval('PT3S')); + $relativeUriFromNow3 = $signer->sign('http://example.com/foo?foo=bar&0=integer', new \DateInterval('PT3S')); + $clock->sleep(10); + + $this->assertFalse($signer->check($relativeUriFromNow1)); + $this->assertFalse($signer->check($relativeUriFromNow2)); + $this->assertFalse($signer->check($relativeUriFromNow3)); + } + public function testNonUrlSafeBase64() { $signer = new UriSigner('foobar'); $this->assertTrue($signer->check('http://example.com/foo?_hash=rIOcC%2FF3DoEGo%2FvnESjSp7uU9zA9S%2F%2BOLhxgMexoPUM%3D&baz=bay&foo=bar')); } + + public function testVerifyUnSignedUri() + { + $signer = new UriSigner('foobar'); + $uri = 'http://example.com/foo'; + + $this->expectException(UnsignedUriException::class); + + $signer->verify($uri); + } + + public function testVerifyUnverifiedUri() + { + $signer = new UriSigner('foobar'); + $uri = 'http://example.com/foo?_hash=invalid'; + + $this->expectException(UnverifiedSignedUriException::class); + + $signer->verify($uri); + } + + public function testVerifyExpiredUri() + { + $signer = new UriSigner('foobar'); + $uri = $signer->sign('http://example.com/foo', 123456); + + $this->expectException(ExpiredSignedUriException::class); + + $signer->verify($uri); + } } diff --git a/src/Symfony/Component/HttpFoundation/UriSigner.php b/src/Symfony/Component/HttpFoundation/UriSigner.php index 1c9e25a5c0151..bb870e43c56f3 100644 --- a/src/Symfony/Component/HttpFoundation/UriSigner.php +++ b/src/Symfony/Component/HttpFoundation/UriSigner.php @@ -11,13 +11,23 @@ namespace Symfony\Component\HttpFoundation; +use Psr\Clock\ClockInterface; +use Symfony\Component\HttpFoundation\Exception\ExpiredSignedUriException; use Symfony\Component\HttpFoundation\Exception\LogicException; +use Symfony\Component\HttpFoundation\Exception\SignedUriException; +use Symfony\Component\HttpFoundation\Exception\UnsignedUriException; +use Symfony\Component\HttpFoundation\Exception\UnverifiedSignedUriException; /** * @author Fabien Potencier */ class UriSigner { + private const STATUS_VALID = 1; + private const STATUS_INVALID = 2; + private const STATUS_MISSING = 3; + private const STATUS_EXPIRED = 4; + /** * @param string $hashParameter Query string parameter to use * @param string $expirationParameter Query string parameter to use for expiration @@ -26,6 +36,7 @@ public function __construct( #[\SensitiveParameter] private string $secret, private string $hashParameter = '_hash', private string $expirationParameter = '_expiration', + private ?ClockInterface $clock = null, ) { if (!$secret) { throw new \InvalidArgumentException('A non-empty secret is required.'); @@ -89,38 +100,40 @@ public function sign(string $uri/* , \DateTimeInterface|\DateInterval|int|null $ */ public function check(string $uri): bool { - $url = parse_url($uri); - $params = []; - - if (isset($url['query'])) { - parse_str($url['query'], $params); - } + return self::STATUS_VALID === $this->doVerify($uri); + } - if (empty($params[$this->hashParameter])) { - return false; - } + public function checkRequest(Request $request): bool + { + return self::STATUS_VALID === $this->doVerify(self::normalize($request)); + } - $hash = $params[$this->hashParameter]; - unset($params[$this->hashParameter]); + /** + * Verify a Request or string URI. + * + * @throws UnsignedUriException If the URI is not signed + * @throws UnverifiedSignedUriException If the signature is invalid + * @throws ExpiredSignedUriException If the URI has expired + * @throws SignedUriException + */ + public function verify(Request|string $uri): void + { + $uri = self::normalize($uri); + $status = $this->doVerify($uri); - // In 8.0, remove support for non-url-safe tokens - if (!hash_equals($this->computeHash($this->buildUrl($url, $params)), strtr(rtrim($hash, '='), ['/' => '_', '+' => '-']))) { - return false; + if (self::STATUS_VALID === $status) { + return; } - if ($expiration = $params[$this->expirationParameter] ?? false) { - return time() < $expiration; + if (self::STATUS_MISSING === $status) { + throw new UnsignedUriException(); } - return true; - } - - public function checkRequest(Request $request): bool - { - $qs = ($qs = $request->server->get('QUERY_STRING')) ? '?'.$qs : ''; + if (self::STATUS_INVALID === $status) { + throw new UnverifiedSignedUriException(); + } - // we cannot use $request->getUri() here as we want to work with the original URI (no query string reordering) - return $this->check($request->getSchemeAndHttpHost().$request->getBaseUrl().$request->getPathInfo().$qs); + throw new ExpiredSignedUriException(); } private function computeHash(string $uri): string @@ -153,9 +166,58 @@ private function getExpirationTime(\DateTimeInterface|\DateInterval|int $expirat } if ($expiration instanceof \DateInterval) { - return \DateTimeImmutable::createFromFormat('U', time())->add($expiration)->format('U'); + return $this->now()->add($expiration)->format('U'); } return (string) $expiration; } + + private function now(): \DateTimeImmutable + { + return $this->clock?->now() ?? \DateTimeImmutable::createFromFormat('U', time()); + } + + /** + * @return self::STATUS_* + */ + private function doVerify(string $uri): int + { + $url = parse_url($uri); + $params = []; + + if (isset($url['query'])) { + parse_str($url['query'], $params); + } + + if (empty($params[$this->hashParameter])) { + return self::STATUS_MISSING; + } + + $hash = $params[$this->hashParameter]; + unset($params[$this->hashParameter]); + + if (!hash_equals($this->computeHash($this->buildUrl($url, $params)), strtr(rtrim($hash, '='), ['/' => '_', '+' => '-']))) { + return self::STATUS_INVALID; + } + + if (!$expiration = $params[$this->expirationParameter] ?? false) { + return self::STATUS_VALID; + } + + if ($this->now()->getTimestamp() < $expiration) { + return self::STATUS_VALID; + } + + return self::STATUS_EXPIRED; + } + + private static function normalize(Request|string $uri): string + { + if ($uri instanceof Request) { + $qs = ($qs = $uri->server->get('QUERY_STRING')) ? '?'.$qs : ''; + $uri = $uri->getSchemeAndHttpHost().$uri->getBaseUrl().$uri->getPathInfo().$qs; + } + + return $uri; + } } diff --git a/src/Symfony/Component/HttpFoundation/composer.json b/src/Symfony/Component/HttpFoundation/composer.json index cb2bbf8cbbeed..a86b21b7c728a 100644 --- a/src/Symfony/Component/HttpFoundation/composer.json +++ b/src/Symfony/Component/HttpFoundation/composer.json @@ -25,6 +25,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", diff --git a/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php b/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php index beca6bfb149a1..915862eddb8cb 100644 --- a/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php +++ b/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php @@ -25,6 +25,9 @@ class TraceableEventDispatcher extends BaseTraceableEventDispatcher { protected function beforeDispatch(string $eventName, object $event): void { + if ($this->disabled?->__invoke()) { + return; + } switch ($eventName) { case KernelEvents::REQUEST: $event->getRequest()->attributes->set('_stopwatch_token', bin2hex(random_bytes(3))); @@ -57,6 +60,9 @@ protected function beforeDispatch(string $eventName, object $event): void protected function afterDispatch(string $eventName, object $event): void { + if ($this->disabled?->__invoke()) { + return; + } switch ($eventName) { case KernelEvents::CONTROLLER_ARGUMENTS: $this->stopwatch->start('controller', 'section'); diff --git a/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php index a5fa06f17b495..a5a863cc153f2 100644 --- a/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php +++ b/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -155,7 +155,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/EventListener/CacheAttributeListener.php b/src/Symfony/Component/HttpKernel/EventListener/CacheAttributeListener.php index e913edf9e538a..436e031bbbcac 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/CacheAttributeListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/CacheAttributeListener.php @@ -165,7 +165,6 @@ public function onKernelResponse(ResponseEvent $event): void } if (true === $cache->noStore) { - $response->setPrivate(); $response->headers->addCacheControlDirective('no-store'); } diff --git a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php index 18e8bff4413d8..2599b27de0c97 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php @@ -161,15 +161,15 @@ public static function getSubscribedEvents(): array /** * Logs an exception. - * + * * @param ?string $logChannel */ protected function logException(\Throwable $exception, string $message, ?string $logLevel = null, /* ?string $logChannel = null */): void { $logChannel = (3 < \func_num_args() ? \func_get_arg(3) : null) ?? $this->resolveLogChannel($exception); - + $logLevel ??= $this->resolveLogLevel($exception); - + if(!$logger = $this->getLogger($logChannel)) { return; } @@ -218,7 +218,7 @@ protected function duplicateRequest(\Throwable $exception, Request $request): Re $attributes = [ '_controller' => $this->controller, 'exception' => $exception, - 'logger' => DebugLoggerConfigurator::getDebugLogger($this->getLogger($exception)), + 'logger' => DebugLoggerConfigurator::getDebugLogger($this->getLogger($this->resolveLogChannel($exception))), ]; $request = $request->duplicate(null, null, $attributes); $request->setMethod('GET'); diff --git a/src/Symfony/Component/HttpKernel/HttpCache/CacheWasLockedException.php b/src/Symfony/Component/HttpKernel/HttpCache/CacheWasLockedException.php new file mode 100644 index 0000000000000..f13946ad71a68 --- /dev/null +++ b/src/Symfony/Component/HttpKernel/HttpCache/CacheWasLockedException.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\HttpKernel\HttpCache; + +/** + * @internal + */ +class CacheWasLockedException extends \Exception +{ +} diff --git a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php index 3ef1b8dcb821f..2b1be6a95a707 100644 --- a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php +++ b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php @@ -210,7 +210,13 @@ public function handle(Request $request, int $type = HttpKernelInterface::MAIN_R $this->record($request, 'reload'); $response = $this->fetch($request, $catch); } else { - $response = $this->lookup($request, $catch); + $response = null; + do { + try { + $response = $this->lookup($request, $catch); + } catch (CacheWasLockedException) { + } + } while (null === $response); } $this->restoreResponseBody($request, $response); @@ -560,15 +566,7 @@ protected function lock(Request $request, Response $entry): bool // wait for the lock to be released if ($this->waitForLock($request)) { - // replace the current entry with the fresh one - $new = $this->lookup($request); - $entry->headers = $new->headers; - $entry->setContent($new->getContent()); - $entry->setStatusCode($new->getStatusCode()); - $entry->setProtocolVersion($new->getProtocolVersion()); - foreach ($new->headers->getCookies() as $cookie) { - $entry->headers->setCookie($cookie); - } + throw new CacheWasLockedException(); // unwind back to handle(), try again } else { // backend is slow as hell, send a 503 response (to avoid the dog pile effect) $entry->setStatusCode(503); diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index b5a41236d1899..10e2512cc0629 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -73,14 +73,14 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static array $freshCache = []; - public const VERSION = '7.3.0-DEV'; - public const VERSION_ID = 70300; + public const VERSION = '7.3.1-DEV'; + public const VERSION_ID = 70301; public const MAJOR_VERSION = 7; public const MINOR_VERSION = 3; - public const RELEASE_VERSION = 0; + public const RELEASE_VERSION = 1; public const EXTRA_VERSION = 'DEV'; - public const END_OF_MAINTENANCE = '05/2025'; + public const END_OF_MAINTENANCE = '01/2026'; public const END_OF_LIFE = '01/2026'; public function __construct( diff --git a/src/Symfony/Component/HttpKernel/Profiler/ProfilerStateChecker.php b/src/Symfony/Component/HttpKernel/Profiler/ProfilerStateChecker.php new file mode 100644 index 0000000000000..56cb4e3cc597f --- /dev/null +++ b/src/Symfony/Component/HttpKernel/Profiler/ProfilerStateChecker.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\Component\HttpKernel\Profiler; + +use Psr\Container\ContainerInterface; + +class ProfilerStateChecker +{ + public function __construct( + private ContainerInterface $container, + private bool $defaultEnabled, + ) { + } + + public function isProfilerEnabled(): bool + { + return $this->container->get('profiler')?->isEnabled() ?? $this->defaultEnabled; + } + + public function isProfilerDisabled(): bool + { + return !$this->isProfilerEnabled(); + } +} diff --git a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php index 03aef073d09fd..a4b1e91d0afe1 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/EventListener/CacheAttributeListenerTest.php b/src/Symfony/Component/HttpKernel/Tests/EventListener/CacheAttributeListenerTest.php index b185ea8994b1f..d2c8ed0db63d5 100644 --- a/src/Symfony/Component/HttpKernel/Tests/EventListener/CacheAttributeListenerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/EventListener/CacheAttributeListenerTest.php @@ -102,18 +102,18 @@ public function testResponseIsPublicIfConfigurationIsPublicTrueNoStoreFalse() $this->assertFalse($this->response->headers->hasCacheControlDirective('no-store')); } - public function testResponseIsPrivateIfConfigurationIsPublicTrueNoStoreTrue() + public function testResponseKeepPublicIfConfigurationIsPublicTrueNoStoreTrue() { $request = $this->createRequest(new Cache(public: true, noStore: true)); $this->listener->onKernelResponse($this->createEventMock($request, $this->response)); - $this->assertFalse($this->response->headers->hasCacheControlDirective('public')); - $this->assertTrue($this->response->headers->hasCacheControlDirective('private')); + $this->assertTrue($this->response->headers->hasCacheControlDirective('public')); + $this->assertFalse($this->response->headers->hasCacheControlDirective('private')); $this->assertTrue($this->response->headers->hasCacheControlDirective('no-store')); } - public function testResponseIsPrivateNoStoreIfConfigurationIsNoStoreTrue() + public function testResponseKeepPrivateNoStoreIfConfigurationIsNoStoreTrue() { $request = $this->createRequest(new Cache(noStore: true)); @@ -124,14 +124,14 @@ public function testResponseIsPrivateNoStoreIfConfigurationIsNoStoreTrue() $this->assertTrue($this->response->headers->hasCacheControlDirective('no-store')); } - public function testResponseIsPrivateIfSharedMaxAgeSetAndNoStoreIsTrue() + public function testResponseIsPublicIfSharedMaxAgeSetAndNoStoreIsTrue() { $request = $this->createRequest(new Cache(smaxage: 1, noStore: true)); $this->listener->onKernelResponse($this->createEventMock($request, $this->response)); - $this->assertFalse($this->response->headers->hasCacheControlDirective('public')); - $this->assertTrue($this->response->headers->hasCacheControlDirective('private')); + $this->assertTrue($this->response->headers->hasCacheControlDirective('public')); + $this->assertFalse($this->response->headers->hasCacheControlDirective('private')); $this->assertTrue($this->response->headers->hasCacheControlDirective('no-store')); } diff --git a/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php b/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php index e82e8fd81b481..240b201306d92 100644 --- a/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php @@ -17,6 +17,7 @@ use Symfony\Component\HttpKernel\Event\TerminateEvent; use Symfony\Component\HttpKernel\HttpCache\Esi; use Symfony\Component\HttpKernel\HttpCache\HttpCache; +use Symfony\Component\HttpKernel\HttpCache\Store; use Symfony\Component\HttpKernel\HttpCache\StoreInterface; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\Kernel; @@ -662,6 +663,7 @@ public function testDegradationWhenCacheLocked() */ sleep(10); + $this->store = $this->createStore(); // create another store instance that does not hold the current lock $this->request('GET', '/'); $this->assertHttpKernelIsNotCalled(); $this->assertEquals(200, $this->response->getStatusCode()); @@ -680,6 +682,64 @@ public function testDegradationWhenCacheLocked() $this->assertEquals('Old response', $this->response->getContent()); } + public function testHitBackendOnlyOnceWhenCacheWasLocked() + { + // Disable stale-while-revalidate, it circumvents waiting for the lock + $this->cacheConfig['stale_while_revalidate'] = 0; + + $this->setNextResponses([ + [ + 'status' => 200, + 'body' => 'initial response', + 'headers' => [ + 'Cache-Control' => 'public, no-cache', + 'Last-Modified' => 'some while ago', + ], + ], + [ + 'status' => 304, + 'body' => '', + 'headers' => [ + 'Cache-Control' => 'public, no-cache', + 'Last-Modified' => 'some while ago', + ], + ], + [ + 'status' => 500, + 'body' => 'The backend should not be called twice during revalidation', + 'headers' => [], + ], + ]); + + $this->request('GET', '/'); // warm the cache + + // Use a store that simulates a cache entry being locked upon first attempt + $this->store = new class(sys_get_temp_dir() . '/http_cache') extends Store { + private bool $hasLock = false; + + public function lock(Request $request): bool + { + $hasLock = $this->hasLock; + $this->hasLock = true; + + return $hasLock; + } + + public function isLocked(Request $request): bool + { + return false; + } + }; + + $this->request('GET', '/'); // hit the cache with simulated lock/concurrency block + + $this->assertEquals(200, $this->response->getStatusCode()); + $this->assertEquals('initial response', $this->response->getContent()); + + $traces = $this->cache->getTraces(); + $this->assertSame(['stale', 'valid', 'store'], current($traces)); + } + public function testHitsCachedResponseWithSMaxAgeDirective() { $time = \DateTimeImmutable::createFromFormat('U', time() - 5); diff --git a/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php b/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php index 26a29f16b2b75..88f6bed56f4cf 100644 --- a/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php +++ b/src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php @@ -30,7 +30,7 @@ abstract class HttpCacheTestCase extends TestCase protected $responses; protected $catch; protected $esi; - protected Store $store; + protected ?Store $store = null; protected function setUp(): void { @@ -115,7 +115,9 @@ public function request($method, $uri = '/', $server = [], $cookies = [], $esi = $this->kernel->reset(); - $this->store = new Store(sys_get_temp_dir().'/http_cache'); + if (! $this->store) { + $this->store = $this->createStore(); + } if (!isset($this->cacheConfig['debug'])) { $this->cacheConfig['debug'] = true; @@ -183,4 +185,9 @@ public static function clearDirectory($directory) closedir($fp); } + + protected function createStore(): Store + { + return new Store(sys_get_temp_dir() . '/http_cache'); + } } diff --git a/src/Symfony/Component/HttpKernel/composer.json b/src/Symfony/Component/HttpKernel/composer.json index e9cb077587abb..bb9f4ba6175de 100644 --- a/src/Symfony/Component/HttpKernel/composer.json +++ b/src/Symfony/Component/HttpKernel/composer.json @@ -19,7 +19,7 @@ "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8", "psr/log": "^1|^2|^3" 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ɔ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)', '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)', '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 0b2614bd2497e..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' => 'Ingarihi (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 --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 (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' => 'енглески (Индија)', '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' => 'англійська (Південний Судан)', '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/timezones/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 5df780260ec92..889ac571950f8 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/JsonPath/JsonCrawler.php b/src/Symfony/Component/JsonPath/JsonCrawler.php index 75c61e14f79d7..35ad6a93a080c 100644 --- a/src/Symfony/Component/JsonPath/JsonCrawler.php +++ b/src/Symfony/Component/JsonPath/JsonCrawler.php @@ -80,19 +80,7 @@ private function evaluate(JsonPath $query): array throw new InvalidJsonStringInputException($e->getMessage(), $e); } - $current = [$data]; - - foreach ($tokens as $token) { - $next = []; - foreach ($current as $value) { - $result = $this->evaluateToken($token, $value); - $next = array_merge($next, $result); - } - - $current = $next; - } - - return $current; + return $this->evaluateTokensOnDecodedData($tokens, $data); } catch (InvalidArgumentException $e) { throw $e; } catch (\Throwable $e) { @@ -100,6 +88,23 @@ private function evaluate(JsonPath $query): array } } + private function evaluateTokensOnDecodedData(array $tokens, array $data): array + { + $current = [$data]; + + foreach ($tokens as $token) { + $next = []; + foreach ($current as $value) { + $result = $this->evaluateToken($token, $value); + $next = array_merge($next, $result); + } + + $current = $next; + } + + return $current; + } + private function evaluateToken(JsonPathToken $token, mixed $value): array { return match ($token->type) { @@ -222,15 +227,64 @@ private function evaluateBracket(string $expr, mixed $value): array throw new JsonCrawlerException($expr, 'Invalid filter expression'); } - // remove outrer filter parentheses + // remove outer filter parentheses $innerExpr = substr(substr($filterExpr, 1), 0, -1); return $this->evaluateFilter($innerExpr, $value); } - // quoted strings for object keys + // comma-separated values, e.g. `['key1', 'key2', 123]` or `[0, 1, 'key']` + if (str_contains($expr, ',')) { + $parts = $this->parseCommaSeparatedValues($expr); + + $result = []; + $keysIndices = array_keys($value); + $isList = array_is_list($value); + + foreach ($parts as $part) { + $part = trim($part); + + if (preg_match('/^([\'"])(.*)\1$/', $part, $matches)) { + $key = JsonPathUtils::unescapeString($matches[2], $matches[1]); + + if ($isList) { + foreach ($value as $item) { + if (\is_array($item) && \array_key_exists($key, $item)) { + $result[] = $item; + break; + } + } + + continue; // no results here + } + + if (\array_key_exists($key, $value)) { + $result[] = $value[$key]; + } + } elseif (preg_match('/^-?\d+$/', $part)) { + // numeric index + $index = (int) $part; + if ($index < 0) { + $index = \count($value) + $index; + } + + if ($isList && \array_key_exists($index, $value)) { + $result[] = $value[$index]; + continue; + } + + // numeric index on a hashmap + if (isset($keysIndices[$index]) && isset($value[$keysIndices[$index]])) { + $result[] = $value[$keysIndices[$index]]; + } + } + } + + return $result; + } + if (preg_match('/^([\'"])(.*)\1$/', $expr, $matches)) { - $key = stripslashes($matches[2]); + $key = JsonPathUtils::unescapeString($matches[2], $matches[1]); return \array_key_exists($key, $value) ? [$value[$key]] : []; } @@ -246,10 +300,6 @@ private function evaluateFilter(string $expr, mixed $value): array $result = []; foreach ($value as $item) { - if (!\is_array($item)) { - continue; - } - if ($this->evaluateFilterExpression($expr, $item)) { $result[] = $item; } @@ -258,7 +308,7 @@ private function evaluateFilter(string $expr, mixed $value): array return $result; } - private function evaluateFilterExpression(string $expr, array $context): bool + private function evaluateFilterExpression(string $expr, mixed $context): bool { $expr = trim($expr); @@ -294,10 +344,12 @@ private function evaluateFilterExpression(string $expr, array $context): bool } } - if (str_starts_with($expr, '@.')) { - $path = substr($expr, 2); + if ('@' === $expr) { + return true; + } - return \array_key_exists($path, $context); + if (str_starts_with($expr, '@.')) { + return (bool) ($this->evaluateTokensOnDecodedData(JsonPathTokenizer::tokenize(new JsonPath('$'.substr($expr, 1))), $context)[0] ?? false); } // function calls @@ -315,12 +367,16 @@ private function evaluateFilterExpression(string $expr, array $context): bool return false; } - private function evaluateScalar(string $expr, array $context): mixed + private function evaluateScalar(string $expr, mixed $context): mixed { if (is_numeric($expr)) { return str_contains($expr, '.') ? (float) $expr : (int) $expr; } + if ('@' === $expr) { + return $context; + } + if ('true' === $expr) { return true; } @@ -335,14 +391,16 @@ private function evaluateScalar(string $expr, array $context): mixed // string literals if (preg_match('/^([\'"])(.*)\1$/', $expr, $matches)) { - return $matches[2]; + return JsonPathUtils::unescapeString($matches[2], $matches[1]); } // current node references - if (str_starts_with($expr, '@.')) { - $path = substr($expr, 2); + if (str_starts_with($expr, '@')) { + if (!\is_array($context)) { + return null; + } - return $context[$path] ?? null; + return $this->evaluateTokensOnDecodedData(JsonPathTokenizer::tokenize(new JsonPath('$'.substr($expr, 1))), $context)[0] ?? null; } // function calls @@ -415,4 +473,44 @@ private function compare(mixed $left, mixed $right, string $operator): bool default => false, }; } + + private function parseCommaSeparatedValues(string $expr): array + { + $parts = []; + $current = ''; + $inQuotes = false; + $quoteChar = null; + + for ($i = 0; $i < \strlen($expr); ++$i) { + $char = $expr[$i]; + + if ('\\' === $char && $i + 1 < \strlen($expr)) { + $current .= $char.$expr[++$i]; + continue; + } + + if ('"' === $char || "'" === $char) { + if (!$inQuotes) { + $inQuotes = true; + $quoteChar = $char; + } elseif ($char === $quoteChar) { + $inQuotes = false; + $quoteChar = null; + } + } elseif (!$inQuotes && ',' === $char) { + $parts[] = trim($current); + $current = ''; + + continue; + } + + $current .= $char; + } + + if ('' !== $current) { + $parts[] = trim($current); + } + + return $parts; + } } diff --git a/src/Symfony/Component/JsonPath/JsonCrawlerInterface.php b/src/Symfony/Component/JsonPath/JsonCrawlerInterface.php index 3e8a222f0ba8e..4859c2bde076b 100644 --- a/src/Symfony/Component/JsonPath/JsonCrawlerInterface.php +++ b/src/Symfony/Component/JsonPath/JsonCrawlerInterface.php @@ -25,7 +25,7 @@ interface JsonCrawlerInterface * @return list * * @throws InvalidArgumentException When the JSON string provided to the crawler cannot be decoded - * @throws JsonCrawlerException When a syntax error occurs in the provided JSON path + * @throws JsonCrawlerException When a syntax error occurs in the provided JSON path */ public function find(string|JsonPath $query): array; } diff --git a/src/Symfony/Component/JsonPath/JsonPath.php b/src/Symfony/Component/JsonPath/JsonPath.php index b44f35795793c..e36fc9ffd2ef1 100644 --- a/src/Symfony/Component/JsonPath/JsonPath.php +++ b/src/Symfony/Component/JsonPath/JsonPath.php @@ -30,7 +30,9 @@ public function __construct( public function key(string $key): static { - return new self($this->path.(str_ends_with($this->path, '..') ? '' : '.').$key); + $escaped = $this->escapeKey($key); + + return new self($this->path.'["'.$escaped.'"]'); } public function index(int $index): static @@ -43,11 +45,21 @@ public function deepScan(): static return new self($this->path.'..'); } - public function anyIndex(): static + public function all(): static { return new self($this->path.'[*]'); } + public function first(): static + { + return new self($this->path.'[0]'); + } + + public function last(): static + { + return new self($this->path.'[-1]'); + } + public function slice(int $start, ?int $end = null, ?int $step = null): static { $slice = $start; @@ -70,4 +82,25 @@ public function __toString(): string { return $this->path; } + + private function escapeKey(string $key): string + { + $key = strtr($key, [ + '\\' => '\\\\', + '"' => '\\"', + "\n" => '\\n', + "\r" => '\\r', + "\t" => '\\t', + "\b" => '\\b', + "\f" => '\\f', + ]); + + for ($i = 0; $i <= 31; ++$i) { + if ($i < 8 || $i > 13) { + $key = str_replace(\chr($i), \sprintf('\\u%04x', $i), $key); + } + } + + return $key; + } } diff --git a/src/Symfony/Component/JsonPath/JsonPathUtils.php b/src/Symfony/Component/JsonPath/JsonPathUtils.php index 9d1e66a39f530..6f971d20115b2 100644 --- a/src/Symfony/Component/JsonPath/JsonPathUtils.php +++ b/src/Symfony/Component/JsonPath/JsonPathUtils.php @@ -11,10 +11,10 @@ namespace Symfony\Component\JsonPath; -use Symfony\Component\JsonStreamer\Read\Splitter; use Symfony\Component\JsonPath\Exception\InvalidArgumentException; use Symfony\Component\JsonPath\Tokenizer\JsonPathToken; use Symfony\Component\JsonPath\Tokenizer\TokenType; +use Symfony\Component\JsonStreamer\Read\Splitter; /** * Get the smallest deserializable JSON string from a list of tokens that doesn't need any processing. @@ -85,4 +85,78 @@ public static function findSmallestDeserializableStringAndPath(array $tokens, mi 'tokens' => $remainingTokens, ]; } + + public static function unescapeString(string $str, string $quoteChar): string + { + if ('"' === $quoteChar) { + // try JSON decoding first for unicode sequences + $jsonStr = '"'.$str.'"'; + $decoded = json_decode($jsonStr, true); + + if (null !== $decoded) { + return $decoded; + } + } + + $result = ''; + $length = \strlen($str); + + for ($i = 0; $i < $length; ++$i) { + if ('\\' === $str[$i] && $i + 1 < $length) { + $result .= match ($str[$i + 1]) { + '"' => '"', + "'" => "'", + '\\' => '\\', + '/' => '/', + 'b' => "\b", + 'f' => "\f", + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'u' => self::unescapeUnicodeSequence($str, $length, $i), + default => $str[$i].$str[$i + 1], // keep the backslash + }; + + ++$i; + } else { + $result .= $str[$i]; + } + } + + return $result; + } + + private static function unescapeUnicodeSequence(string $str, int $length, int &$i): string + { + if ($i + 5 >= $length) { + // not enough characters for Unicode escape, treat as literal + return $str[$i]; + } + + $hex = substr($str, $i + 2, 4); + if (!ctype_xdigit($hex)) { + // invalid hex, treat as literal + return $str[$i]; + } + + $codepoint = hexdec($hex); + // looks like a valid Unicode codepoint, string length is sufficient and it starts with \u + if (0xD800 <= $codepoint && $codepoint <= 0xDBFF && $i + 11 < $length && '\\' === $str[$i + 6] && 'u' === $str[$i + 7]) { + $lowHex = substr($str, $i + 8, 4); + if (ctype_xdigit($lowHex)) { + $lowSurrogate = hexdec($lowHex); + if (0xDC00 <= $lowSurrogate && $lowSurrogate <= 0xDFFF) { + $codepoint = 0x10000 + (($codepoint & 0x3FF) << 10) + ($lowSurrogate & 0x3FF); + $i += 10; // skip surrogate pair + + return mb_chr($codepoint, 'UTF-8'); + } + } + } + + // single Unicode character or invalid surrogate, skip the sequence + $i += 4; + + return mb_chr($codepoint, 'UTF-8'); + } } diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathAssertionsTrait.php b/src/Symfony/Component/JsonPath/Test/JsonPathAssertionsTrait.php new file mode 100644 index 0000000000000..42d35339a5760 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathAssertionsTrait.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\JsonPath\Test; + +use PHPUnit\Framework\Assert; +use PHPUnit\Framework\ExpectationFailedException; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +trait JsonPathAssertionsTrait +{ + /** + * @throws ExpectationFailedException + */ + final public static function assertJsonPathEquals(mixed $expectedValue, JsonPath|string $jsonPath, string $json, string $message = ''): void + { + Assert::assertThat($expectedValue, new JsonPathEquals($jsonPath, $json), $message); + } + + /** + * @throws ExpectationFailedException + */ + final public static function assertJsonPathNotEquals(mixed $expectedValue, JsonPath|string $jsonPath, string $json, string $message = ''): void + { + Assert::assertThat($expectedValue, new JsonPathNotEquals($jsonPath, $json), $message); + } + + /** + * @throws ExpectationFailedException + */ + final public static function assertJsonPathCount(int $expectedCount, JsonPath|string $jsonPath, string $json, string $message = ''): void + { + Assert::assertThat($expectedCount, new JsonPathCount($jsonPath, $json), $message); + } + + /** + * @throws ExpectationFailedException + */ + final public static function assertJsonPathSame(mixed $expectedValue, JsonPath|string $jsonPath, string $json, string $message = ''): void + { + Assert::assertThat($expectedValue, new JsonPathSame($jsonPath, $json), $message); + } + + /** + * @throws ExpectationFailedException + */ + final public static function assertJsonPathNotSame(mixed $expectedValue, JsonPath|string $jsonPath, string $json, string $message = ''): void + { + Assert::assertThat($expectedValue, new JsonPathNotSame($jsonPath, $json), $message); + } + + /** + * @throws ExpectationFailedException + */ + final public static function assertJsonPathContains(mixed $expectedValue, JsonPath|string $jsonPath, string $json, bool $strict = true, string $message = ''): void + { + Assert::assertThat($expectedValue, new JsonPathContains($jsonPath, $json, $strict), $message); + } + + /** + * @throws ExpectationFailedException + */ + final public static function assertJsonPathNotContains(mixed $expectedValue, JsonPath|string $jsonPath, string $json, bool $strict = true, string $message = ''): void + { + Assert::assertThat($expectedValue, new JsonPathNotContains($jsonPath, $json, $strict), $message); + } +} diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathContains.php b/src/Symfony/Component/JsonPath/Test/JsonPathContains.php new file mode 100644 index 0000000000000..e043b90a40637 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathContains.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\JsonPath\Test; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\JsonPath\JsonCrawler; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +class JsonPathContains extends Constraint +{ + public function __construct( + private JsonPath|string $jsonPath, + private string $json, + private bool $strict = true, + ) { + } + + public function toString(): string + { + return \sprintf('is found in elements at JSON path "%s"', $this->jsonPath); + } + + protected function matches(mixed $other): bool + { + $result = (new JsonCrawler($this->json))->find($this->jsonPath); + + return \in_array($other, $result, $this->strict); + } +} diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathCount.php b/src/Symfony/Component/JsonPath/Test/JsonPathCount.php new file mode 100644 index 0000000000000..8c973a8309345 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathCount.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\JsonPath\Test; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\JsonPath\JsonCrawler; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +class JsonPathCount extends Constraint +{ + public function __construct( + private JsonPath|string $jsonPath, + private string $json, + ) { + } + + public function toString(): string + { + return \sprintf('matches expected count of JSON path "%s"', $this->jsonPath); + } + + protected function matches(mixed $other): bool + { + return $other === \count((new JsonCrawler($this->json))->find($this->jsonPath)); + } +} diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathEquals.php b/src/Symfony/Component/JsonPath/Test/JsonPathEquals.php new file mode 100644 index 0000000000000..56825434b5faa --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathEquals.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\JsonPath\Test; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\JsonPath\JsonCrawler; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +class JsonPathEquals extends Constraint +{ + public function __construct( + private JsonPath|string $jsonPath, + private string $json, + ) { + } + + public function toString(): string + { + return \sprintf('equals JSON path "%s" result', $this->jsonPath); + } + + protected function matches(mixed $other): bool + { + return (new JsonCrawler($this->json))->find($this->jsonPath) == $other; + } +} diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathNotContains.php b/src/Symfony/Component/JsonPath/Test/JsonPathNotContains.php new file mode 100644 index 0000000000000..721d60fa29984 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathNotContains.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\JsonPath\Test; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\JsonPath\JsonCrawler; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +class JsonPathNotContains extends Constraint +{ + public function __construct( + private JsonPath|string $jsonPath, + private string $json, + private bool $strict = true, + ) { + } + + public function toString(): string + { + return \sprintf('is not found in elements at JSON path "%s"', $this->jsonPath); + } + + protected function matches(mixed $other): bool + { + $result = (new JsonCrawler($this->json))->find($this->jsonPath); + + return !\in_array($other, $result, $this->strict); + } +} diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathNotEquals.php b/src/Symfony/Component/JsonPath/Test/JsonPathNotEquals.php new file mode 100644 index 0000000000000..d149dbb59c441 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathNotEquals.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\JsonPath\Test; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\JsonPath\JsonCrawler; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +class JsonPathNotEquals extends Constraint +{ + public function __construct( + private JsonPath|string $jsonPath, + private string $json, + ) { + } + + public function toString(): string + { + return \sprintf('does not equal JSON path "%s" result', $this->jsonPath); + } + + protected function matches(mixed $other): bool + { + return (new JsonCrawler($this->json))->find($this->jsonPath) != $other; + } +} diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathNotSame.php b/src/Symfony/Component/JsonPath/Test/JsonPathNotSame.php new file mode 100644 index 0000000000000..248ac456fcbef --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathNotSame.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\JsonPath\Test; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\JsonPath\JsonCrawler; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +class JsonPathNotSame extends Constraint +{ + public function __construct( + private JsonPath|string $jsonPath, + private string $json, + ) { + } + + public function toString(): string + { + return \sprintf('is not identical to JSON path "%s" result', $this->jsonPath); + } + + protected function matches(mixed $other): bool + { + return (new JsonCrawler($this->json))->find($this->jsonPath) !== $other; + } +} diff --git a/src/Symfony/Component/JsonPath/Test/JsonPathSame.php b/src/Symfony/Component/JsonPath/Test/JsonPathSame.php new file mode 100644 index 0000000000000..469922d8a0b90 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Test/JsonPathSame.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\JsonPath\Test; + +use PHPUnit\Framework\Constraint\Constraint; +use Symfony\Component\JsonPath\JsonCrawler; +use Symfony\Component\JsonPath\JsonPath; + +/** + * @author Alexandre Daubois + * + * @experimental + */ +class JsonPathSame extends Constraint +{ + public function __construct( + private JsonPath|string $jsonPath, + private string $json, + ) { + } + + public function toString(): string + { + return \sprintf('is identical to JSON path "%s" result', $this->jsonPath); + } + + protected function matches(mixed $other): bool + { + return (new JsonCrawler($this->json))->find($this->jsonPath) === $other; + } +} diff --git a/src/Symfony/Component/JsonPath/Tests/Fixtures/Makefile b/src/Symfony/Component/JsonPath/Tests/Fixtures/Makefile new file mode 100644 index 0000000000000..d9b4c353f4a76 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Tests/Fixtures/Makefile @@ -0,0 +1,9 @@ +override hash := 05f6cac786bf0cce95437e6f1adedc3186d54a71 + +.PHONY: cts.json +cts.json: + curl -f https://raw.githubusercontent.com/jsonpath-standard/jsonpath-compliance-test-suite/$(hash)/cts.json -o cts.json + +.PHONY: clean +clean: + rm -f cts.json diff --git a/src/Symfony/Component/JsonPath/Tests/Fixtures/cts.json b/src/Symfony/Component/JsonPath/Tests/Fixtures/cts.json new file mode 100644 index 0000000000000..363dce7893ca6 --- /dev/null +++ b/src/Symfony/Component/JsonPath/Tests/Fixtures/cts.json @@ -0,0 +1,12702 @@ +{ + "description": "JSONPath Compliance Test Suite. This file is autogenerated, do not edit.", + "tests": [ + { + "name": "basic, root", + "selector": "$", + "document": [ + "first", + "second" + ], + "result": [ + [ + "first", + "second" + ] + ], + "result_paths": [ + "$" + ] + }, + { + "name": "basic, no leading whitespace", + "selector": " $", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "basic, no trailing whitespace", + "selector": "$ ", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "basic, name shorthand", + "selector": "$.a", + "document": { + "a": "A", + "b": "B" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['a']" + ] + }, + { + "name": "basic, name shorthand, extended unicode ☺", + "selector": "$.☺", + "document": { + "☺": "A", + "b": "B" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['☺']" + ] + }, + { + "name": "basic, name shorthand, underscore", + "selector": "$._", + "document": { + "_": "A", + "_foo": "B" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['_']" + ] + }, + { + "name": "basic, name shorthand, symbol", + "selector": "$.&", + "invalid_selector": true + }, + { + "name": "basic, name shorthand, number", + "selector": "$.1", + "invalid_selector": true + }, + { + "name": "basic, name shorthand, absent data", + "selector": "$.c", + "document": { + "a": "A", + "b": "B" + }, + "result": [], + "result_paths": [] + }, + { + "name": "basic, name shorthand, array data", + "selector": "$.a", + "document": [ + "first", + "second" + ], + "result": [], + "result_paths": [] + }, + { + "name": "basic, name shorthand, object data, nested", + "selector": "$.a.b.c", + "document": { + "a": { + "b": { + "c": "C" + } + } + }, + "result": [ + "C" + ], + "result_paths": [ + "$['a']['b']['c']" + ] + }, + { + "name": "basic, wildcard shorthand, object data", + "selector": "$.*", + "document": { + "a": "A", + "b": "B" + }, + "results": [ + [ + "A", + "B" + ], + [ + "B", + "A" + ] + ], + "results_paths": [ + [ + "$['a']", + "$['b']" + ], + [ + "$['b']", + "$['a']" + ] + ] + }, + { + "name": "basic, wildcard shorthand, array data", + "selector": "$.*", + "document": [ + "first", + "second" + ], + "result": [ + "first", + "second" + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "basic, wildcard selector, array data", + "selector": "$[*]", + "document": [ + "first", + "second" + ], + "result": [ + "first", + "second" + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "basic, wildcard shorthand, then name shorthand", + "selector": "$.*.a", + "document": { + "x": { + "a": "Ax", + "b": "Bx" + }, + "y": { + "a": "Ay", + "b": "By" + } + }, + "results": [ + [ + "Ax", + "Ay" + ], + [ + "Ay", + "Ax" + ] + ], + "results_paths": [ + [ + "$['x']['a']", + "$['y']['a']" + ], + [ + "$['y']['a']", + "$['x']['a']" + ] + ] + }, + { + "name": "basic, multiple selectors", + "selector": "$[0,2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 0, + 2 + ], + "result_paths": [ + "$[0]", + "$[2]" + ] + }, + { + "name": "basic, multiple selectors, space instead of comma", + "selector": "$[0 2]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "basic, selector, leading comma", + "selector": "$[,0]", + "invalid_selector": true + }, + { + "name": "basic, selector, trailing comma", + "selector": "$[0,]", + "invalid_selector": true + }, + { + "name": "basic, multiple selectors, name and index, array data", + "selector": "$['a',1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1 + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "basic, multiple selectors, name and index, object data", + "selector": "$['a',1]", + "document": { + "a": 1, + "b": 2 + }, + "result": [ + 1 + ], + "result_paths": [ + "$['a']" + ] + }, + { + "name": "basic, multiple selectors, index and slice", + "selector": "$[1,5:7]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1, + 5, + 6 + ], + "result_paths": [ + "$[1]", + "$[5]", + "$[6]" + ] + }, + { + "name": "basic, multiple selectors, index and slice, overlapping", + "selector": "$[1,0:3]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1, + 0, + 1, + 2 + ], + "result_paths": [ + "$[1]", + "$[0]", + "$[1]", + "$[2]" + ] + }, + { + "name": "basic, multiple selectors, duplicate index", + "selector": "$[1,1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1, + 1 + ], + "result_paths": [ + "$[1]", + "$[1]" + ] + }, + { + "name": "basic, multiple selectors, wildcard and index", + "selector": "$[*,1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 1 + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[3]", + "$[4]", + "$[5]", + "$[6]", + "$[7]", + "$[8]", + "$[9]", + "$[1]" + ] + }, + { + "name": "basic, multiple selectors, wildcard and name", + "selector": "$[*,'a']", + "document": { + "a": "A", + "b": "B" + }, + "results": [ + [ + "A", + "B", + "A" + ], + [ + "B", + "A", + "A" + ] + ], + "results_paths": [ + [ + "$['a']", + "$['b']", + "$['a']" + ], + [ + "$['b']", + "$['a']", + "$['a']" + ] + ] + }, + { + "name": "basic, multiple selectors, wildcard and slice", + "selector": "$[*,0:2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0, + 1 + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[3]", + "$[4]", + "$[5]", + "$[6]", + "$[7]", + "$[8]", + "$[9]", + "$[0]", + "$[1]" + ] + }, + { + "name": "basic, multiple selectors, multiple wildcards", + "selector": "$[*,*]", + "document": [ + 0, + 1, + 2 + ], + "result": [ + 0, + 1, + 2, + 0, + 1, + 2 + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[0]", + "$[1]", + "$[2]" + ] + }, + { + "name": "basic, empty segment", + "selector": "$[]", + "invalid_selector": true + }, + { + "name": "basic, descendant segment, index", + "selector": "$..[1]", + "document": { + "o": [ + 0, + 1, + [ + 2, + 3 + ] + ] + }, + "result": [ + 1, + 3 + ], + "result_paths": [ + "$['o'][1]", + "$['o'][2][1]" + ] + }, + { + "name": "basic, descendant segment, name shorthand", + "selector": "$..a", + "document": { + "o": [ + { + "a": "b" + }, + { + "a": "c" + } + ] + }, + "result": [ + "b", + "c" + ], + "result_paths": [ + "$['o'][0]['a']", + "$['o'][1]['a']" + ] + }, + { + "name": "basic, descendant segment, wildcard shorthand, array data", + "selector": "$..*", + "document": [ + 0, + 1 + ], + "result": [ + 0, + 1 + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "basic, descendant segment, wildcard selector, array data", + "selector": "$..[*]", + "document": [ + 0, + 1 + ], + "result": [ + 0, + 1 + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "basic, descendant segment, wildcard selector, nested arrays", + "selector": "$..[*]", + "document": [ + [ + [ + 1 + ] + ], + [ + 2 + ] + ], + "results": [ + [ + [ + [ + 1 + ] + ], + [ + 2 + ], + [ + 1 + ], + 1, + 2 + ], + [ + [ + [ + 1 + ] + ], + [ + 2 + ], + [ + 1 + ], + 2, + 1 + ] + ], + "results_paths": [ + [ + "$[0]", + "$[1]", + "$[0][0]", + "$[0][0][0]", + "$[1][0]" + ], + [ + "$[0]", + "$[1]", + "$[0][0]", + "$[1][0]", + "$[0][0][0]" + ] + ] + }, + { + "name": "basic, descendant segment, wildcard selector, nested objects", + "selector": "$..[*]", + "document": { + "a": { + "c": { + "e": 1 + } + }, + "b": { + "d": 2 + } + }, + "results": [ + [ + { + "c": { + "e": 1 + } + }, + { + "d": 2 + }, + { + "e": 1 + }, + 1, + 2 + ], + [ + { + "c": { + "e": 1 + } + }, + { + "d": 2 + }, + { + "e": 1 + }, + 2, + 1 + ], + [ + { + "c": { + "e": 1 + } + }, + { + "d": 2 + }, + 2, + { + "e": 1 + }, + 1 + ], + [ + { + "d": 2 + }, + { + "c": { + "e": 1 + } + }, + { + "e": 1 + }, + 1, + 2 + ], + [ + { + "d": 2 + }, + { + "c": { + "e": 1 + } + }, + { + "e": 1 + }, + 2, + 1 + ], + [ + { + "d": 2 + }, + { + "c": { + "e": 1 + } + }, + 2, + { + "e": 1 + }, + 1 + ] + ], + "results_paths": [ + [ + "$['a']", + "$['b']", + "$['a']['c']", + "$['a']['c']['e']", + "$['b']['d']" + ], + [ + "$['a']", + "$['b']", + "$['a']['c']", + "$['b']['d']", + "$['a']['c']['e']" + ], + [ + "$['a']", + "$['b']", + "$['b']['d']", + "$['a']['c']", + "$['a']['c']['e']" + ], + [ + "$['b']", + "$['a']", + "$['a']['c']", + "$['a']['c']['e']", + "$['b']['d']" + ], + [ + "$['b']", + "$['a']", + "$['a']['c']", + "$['b']['d']", + "$['a']['c']['e']" + ], + [ + "$['b']", + "$['a']", + "$['b']['d']", + "$['a']['c']", + "$['a']['c']['e']" + ] + ] + }, + { + "name": "basic, descendant segment, wildcard shorthand, object data", + "selector": "$..*", + "document": { + "a": "b" + }, + "result": [ + "b" + ], + "result_paths": [ + "$['a']" + ] + }, + { + "name": "basic, descendant segment, wildcard shorthand, nested data", + "selector": "$..*", + "document": { + "o": [ + { + "a": "b" + } + ] + }, + "result": [ + [ + { + "a": "b" + } + ], + { + "a": "b" + }, + "b" + ], + "result_paths": [ + "$['o']", + "$['o'][0]", + "$['o'][0]['a']" + ] + }, + { + "name": "basic, descendant segment, multiple selectors", + "selector": "$..['a','d']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + "b", + "e", + "c", + "f" + ], + "result_paths": [ + "$[0]['a']", + "$[0]['d']", + "$[1]['a']", + "$[1]['d']" + ] + }, + { + "name": "basic, descendant segment, object traversal, multiple selectors", + "selector": "$..['a','d']", + "document": { + "x": { + "a": "b", + "d": "e" + }, + "y": { + "a": "c", + "d": "f" + } + }, + "results": [ + [ + "b", + "e", + "c", + "f" + ], + [ + "c", + "f", + "b", + "e" + ] + ], + "results_paths": [ + [ + "$['x']['a']", + "$['x']['d']", + "$['y']['a']", + "$['y']['d']" + ], + [ + "$['y']['a']", + "$['y']['d']", + "$['x']['a']", + "$['x']['d']" + ] + ] + }, + { + "name": "basic, bald descendant segment", + "selector": "$..", + "invalid_selector": true + }, + { + "name": "basic, current node identifier without filter selector", + "selector": "$[@.a]", + "invalid_selector": true + }, + { + "name": "basic, root node identifier in brackets without filter selector", + "selector": "$[$.a]", + "invalid_selector": true + }, + { + "name": "filter, existence, without segments", + "selector": "$[?@]", + "document": { + "a": 1, + "b": null + }, + "results": [ + [ + 1, + null + ], + [ + null, + 1 + ] + ], + "results_paths": [ + [ + "$['a']", + "$['b']" + ], + [ + "$['b']", + "$['a']" + ] + ] + }, + { + "name": "filter, existence", + "selector": "$[?@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, existence, present with null", + "selector": "$[?@.a]", + "document": [ + { + "a": null, + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": null, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, absolute existence, without segments", + "selector": "$[?$]", + "document": { + "a": 1, + "b": null + }, + "results": [ + [ + 1, + null + ], + [ + null, + 1 + ] + ], + "results_paths": [ + [ + "$['a']", + "$['b']" + ], + [ + "$['b']", + "$['a']" + ] + ] + }, + { + "name": "filter, absolute existence, with segments", + "selector": "$[?$.*.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "filter, equals string, single quotes", + "selector": "$[?@.a=='b']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals numeric string, single quotes", + "selector": "$[?@.a=='1']", + "document": [ + { + "a": "1", + "d": "e" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": "1", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals string, double quotes", + "selector": "$[?@.a==\"b\"]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals numeric string, double quotes", + "selector": "$[?@.a==\"1\"]", + "document": [ + { + "a": "1", + "d": "e" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": "1", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number", + "selector": "$[?@.a==1]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "f" + } + ], + "result": [ + { + "a": 1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals null", + "selector": "$[?@.a==null]", + "document": [ + { + "a": null, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": null, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals null, absent from data", + "selector": "$[?@.a==null]", + "document": [ + { + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [], + "result_paths": [] + }, + { + "name": "filter, equals true", + "selector": "$[?@.a==true]", + "document": [ + { + "a": true, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": true, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals false", + "selector": "$[?@.a==false]", + "document": [ + { + "a": false, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": false, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals self", + "selector": "$[?@==@]", + "document": [ + 1, + null, + true, + { + "a": "b" + }, + [ + false + ] + ], + "result": [ + 1, + null, + true, + { + "a": "b" + }, + [ + false + ] + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[3]", + "$[4]" + ] + }, + { + "name": "filter, absolute, equals self", + "selector": "$[?$==$]", + "document": [ + 1, + null, + true, + { + "a": "b" + }, + [ + false + ] + ], + "result": [ + 1, + null, + true, + { + "a": "b" + }, + [ + false + ] + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[3]", + "$[4]" + ] + }, + { + "name": "filter, equals, absent from index selector equals absent from name selector", + "selector": "$[?@.absent==@.list[9]]", + "document": [ + { + "list": [ + 1 + ] + } + ], + "result": [ + { + "list": [ + 1 + ] + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, deep equality, arrays", + "selector": "$[?@.a==@.b]", + "document": [ + { + "a": false, + "b": [ + 1, + 2 + ] + }, + { + "a": [ + [ + 1, + [ + 2 + ] + ] + ], + "b": [ + [ + 1, + [ + 2 + ] + ] + ] + }, + { + "a": [ + [ + 1, + [ + 2 + ] + ] + ], + "b": [ + [ + [ + 2 + ], + 1 + ] + ] + }, + { + "a": [ + [ + 1, + [ + 2 + ] + ] + ], + "b": [ + [ + 1, + 2 + ] + ] + } + ], + "result": [ + { + "a": [ + [ + 1, + [ + 2 + ] + ] + ], + "b": [ + [ + 1, + [ + 2 + ] + ] + ] + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, deep equality, objects", + "selector": "$[?@.a==@.b]", + "document": [ + { + "a": false, + "b": { + "x": 1, + "y": { + "z": 1 + } + } + }, + { + "a": { + "x": 1, + "y": { + "z": 1 + } + }, + "b": { + "x": 1, + "y": { + "z": 1 + } + } + }, + { + "a": { + "x": 1, + "y": { + "z": 1 + } + }, + "b": { + "y": { + "z": 1 + }, + "x": 1 + } + }, + { + "a": { + "x": 1, + "y": { + "z": 1 + } + }, + "b": { + "x": 1 + } + }, + { + "a": { + "x": 1, + "y": { + "z": 1 + } + }, + "b": { + "x": 1, + "y": { + "z": 2 + } + } + } + ], + "result": [ + { + "a": { + "x": 1, + "y": { + "z": 1 + } + }, + "b": { + "x": 1, + "y": { + "z": 1 + } + } + }, + { + "a": { + "x": 1, + "y": { + "z": 1 + } + }, + "b": { + "y": { + "z": 1 + }, + "x": 1 + } + } + ], + "result_paths": [ + "$[1]", + "$[2]" + ] + }, + { + "name": "filter, not-equals string, single quotes", + "selector": "$[?@.a!='b']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals numeric string, single quotes", + "selector": "$[?@.a!='1']", + "document": [ + { + "a": "1", + "d": "e" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": 1, + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals string, single quotes, different type", + "selector": "$[?@.a!='b']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": 1, + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals string, double quotes", + "selector": "$[?@.a!=\"b\"]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals numeric string, double quotes", + "selector": "$[?@.a!=\"1\"]", + "document": [ + { + "a": "1", + "d": "e" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": 1, + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals string, double quotes, different types", + "selector": "$[?@.a!=\"b\"]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": 1, + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals number", + "selector": "$[?@.a!=1]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "f" + } + ], + "result": [ + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "f" + } + ], + "result_paths": [ + "$[1]", + "$[2]" + ] + }, + { + "name": "filter, not-equals number, different types", + "selector": "$[?@.a!=1]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals null", + "selector": "$[?@.a!=null]", + "document": [ + { + "a": null, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals null, absent from data", + "selector": "$[?@.a!=null]", + "document": [ + { + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "filter, not-equals true", + "selector": "$[?@.a!=true]", + "document": [ + { + "a": true, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not-equals false", + "selector": "$[?@.a!=false]", + "document": [ + { + "a": false, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, less than string, single quotes", + "selector": "$[?@.a<'c']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, less than string, double quotes", + "selector": "$[?@.a<\"c\"]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, less than number", + "selector": "$[?@.a<10]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 10, + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": 20, + "d": "f" + } + ], + "result": [ + { + "a": 1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, less than null", + "selector": "$[?@.a'c']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[2]" + ] + }, + { + "name": "filter, greater than string, double quotes", + "selector": "$[?@.a>\"c\"]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[2]" + ] + }, + { + "name": "filter, greater than number", + "selector": "$[?@.a>10]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 10, + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": 20, + "d": "f" + } + ], + "result": [ + { + "a": 20, + "d": "f" + } + ], + "result_paths": [ + "$[3]" + ] + }, + { + "name": "filter, greater than null", + "selector": "$[?@.a>null]", + "document": [ + { + "a": null, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [], + "result_paths": [] + }, + { + "name": "filter, greater than true", + "selector": "$[?@.a>true]", + "document": [ + { + "a": true, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [], + "result_paths": [] + }, + { + "name": "filter, greater than false", + "selector": "$[?@.a>false]", + "document": [ + { + "a": false, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [], + "result_paths": [] + }, + { + "name": "filter, greater than or equal to string, single quotes", + "selector": "$[?@.a>='c']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[1]", + "$[2]" + ] + }, + { + "name": "filter, greater than or equal to string, double quotes", + "selector": "$[?@.a>=\"c\"]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[1]", + "$[2]" + ] + }, + { + "name": "filter, greater than or equal to number", + "selector": "$[?@.a>=10]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 10, + "d": "e" + }, + { + "a": "c", + "d": "f" + }, + { + "a": 20, + "d": "f" + } + ], + "result": [ + { + "a": 10, + "d": "e" + }, + { + "a": 20, + "d": "f" + } + ], + "result_paths": [ + "$[1]", + "$[3]" + ] + }, + { + "name": "filter, greater than or equal to null", + "selector": "$[?@.a>=null]", + "document": [ + { + "a": null, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": null, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, greater than or equal to true", + "selector": "$[?@.a>=true]", + "document": [ + { + "a": true, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": true, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, greater than or equal to false", + "selector": "$[?@.a>=false]", + "document": [ + { + "a": false, + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": false, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, exists and not-equals null, absent from data", + "selector": "$[?@.a&&@.a!=null]", + "document": [ + { + "d": "e" + }, + { + "a": "c", + "d": "f" + } + ], + "result": [ + { + "a": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, exists and exists, data false", + "selector": "$[?@.a&&@.b]", + "document": [ + { + "a": false, + "b": false + }, + { + "b": false + }, + { + "c": false + } + ], + "result": [ + { + "a": false, + "b": false + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, exists or exists, data false", + "selector": "$[?@.a||@.b]", + "document": [ + { + "a": false, + "b": false + }, + { + "b": false + }, + { + "c": false + } + ], + "result": [ + { + "a": false, + "b": false + }, + { + "b": false + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "filter, and", + "selector": "$[?@.a>0&&@.a<10]", + "document": [ + { + "a": -10, + "d": "e" + }, + { + "a": 5, + "d": "f" + }, + { + "a": 20, + "d": "f" + } + ], + "result": [ + { + "a": 5, + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, or", + "selector": "$[?@.a=='b'||@.a=='d']", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "a": "b", + "d": "f" + }, + { + "a": "c", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[1]", + "$[3]" + ] + }, + { + "name": "filter, not expression", + "selector": "$[?!(@.a=='b')]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "a": "b", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "a", + "d": "e" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[2]" + ] + }, + { + "name": "filter, not exists", + "selector": "$[?!@.a]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, not exists, data null", + "selector": "$[?!@.a]", + "document": [ + { + "a": null, + "d": "e" + }, + { + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ] + }, + { + "name": "filter, non-singular existence, wildcard", + "selector": "$[?@.*]", + "document": [ + 1, + [], + [ + 2 + ], + {}, + { + "a": 3 + } + ], + "result": [ + [ + 2 + ], + { + "a": 3 + } + ], + "result_paths": [ + "$[2]", + "$[4]" + ] + }, + { + "name": "filter, non-singular existence, multiple", + "selector": "$[?@[0, 0, 'a']]", + "document": [ + 1, + [], + [ + 2 + ], + [ + 2, + 3 + ], + { + "a": 3 + }, + { + "b": 4 + }, + { + "a": 3, + "b": 4 + } + ], + "result": [ + [ + 2 + ], + [ + 2, + 3 + ], + { + "a": 3 + }, + { + "a": 3, + "b": 4 + } + ], + "result_paths": [ + "$[2]", + "$[3]", + "$[4]", + "$[6]" + ] + }, + { + "name": "filter, non-singular existence, slice", + "selector": "$[?@[0:2]]", + "document": [ + 1, + [], + [ + 2 + ], + [ + 2, + 3, + 4 + ], + {}, + { + "a": 3 + } + ], + "result": [ + [ + 2 + ], + [ + 2, + 3, + 4 + ] + ], + "result_paths": [ + "$[2]", + "$[3]" + ] + }, + { + "name": "filter, non-singular existence, negated", + "selector": "$[?!@.*]", + "document": [ + 1, + [], + [ + 2 + ], + {}, + { + "a": 3 + } + ], + "result": [ + 1, + [], + {} + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[3]" + ] + }, + { + "name": "filter, non-singular query in comparison, slice", + "selector": "$[?@[0:0]==0]", + "invalid_selector": true + }, + { + "name": "filter, non-singular query in comparison, all children", + "selector": "$[?@[*]==0]", + "invalid_selector": true + }, + { + "name": "filter, non-singular query in comparison, descendants", + "selector": "$[?@..a==0]", + "invalid_selector": true + }, + { + "name": "filter, non-singular query in comparison, combined", + "selector": "$[?@.a[*].a==0]", + "invalid_selector": true + }, + { + "name": "filter, nested", + "selector": "$[?@[?@>1]]", + "document": [ + [ + 0 + ], + [ + 0, + 1 + ], + [ + 0, + 1, + 2 + ], + [ + 42 + ] + ], + "result": [ + [ + 0, + 1, + 2 + ], + [ + 42 + ] + ], + "result_paths": [ + "$[2]", + "$[3]" + ] + }, + { + "name": "filter, name segment on primitive, selects nothing", + "selector": "$[?@.a == 1]", + "document": { + "a": 1 + }, + "result": [], + "result_paths": [] + }, + { + "name": "filter, name segment on array, selects nothing", + "selector": "$[?@['0'] == 5]", + "document": [ + [ + 5, + 6 + ] + ], + "result": [], + "result_paths": [] + }, + { + "name": "filter, index segment on object, selects nothing", + "selector": "$[?@[0] == 5]", + "document": [ + { + "0": 5 + } + ], + "result": [], + "result_paths": [] + }, + { + "name": "filter, followed by name selector", + "selector": "$[?@.a==1].b.x", + "document": [ + { + "a": 1, + "b": { + "x": 2 + } + } + ], + "result": [ + 2 + ], + "result_paths": [ + "$[0]['b']['x']" + ] + }, + { + "name": "filter, followed by child segment that selects multiple elements", + "selector": "$[?@.z=='_']['x','y']", + "document": [ + { + "x": 1, + "y": null, + "z": "_" + } + ], + "result": [ + 1, + null + ], + "result_paths": [ + "$[0]['x']", + "$[0]['y']" + ] + }, + { + "name": "filter, relative non-singular query, index, equal", + "selector": "$[?(@[0, 0]==42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, index, not equal", + "selector": "$[?(@[0, 0]!=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, index, less-or-equal", + "selector": "$[?(@[0, 0]<=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, name, equal", + "selector": "$[?(@['a', 'a']==42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, name, not equal", + "selector": "$[?(@['a', 'a']!=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, name, less-or-equal", + "selector": "$[?(@['a', 'a']<=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, combined, equal", + "selector": "$[?(@[0, '0']==42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, combined, not equal", + "selector": "$[?(@[0, '0']!=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, combined, less-or-equal", + "selector": "$[?(@[0, '0']<=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, relative non-singular query, wildcard, equal", + "selector": "$[?(@.*==42)]", + "invalid_selector": true + }, + { + "name": "filter, relative non-singular query, wildcard, not equal", + "selector": "$[?(@.*!=42)]", + "invalid_selector": true + }, + { + "name": "filter, relative non-singular query, wildcard, less-or-equal", + "selector": "$[?(@.*<=42)]", + "invalid_selector": true + }, + { + "name": "filter, relative non-singular query, slice, equal", + "selector": "$[?(@[0:0]==42)]", + "invalid_selector": true + }, + { + "name": "filter, relative non-singular query, slice, not equal", + "selector": "$[?(@[0:0]!=42)]", + "invalid_selector": true + }, + { + "name": "filter, relative non-singular query, slice, less-or-equal", + "selector": "$[?(@[0:0]<=42)]", + "invalid_selector": true + }, + { + "name": "filter, absolute non-singular query, index, equal", + "selector": "$[?($[0, 0]==42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, index, not equal", + "selector": "$[?($[0, 0]!=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, index, less-or-equal", + "selector": "$[?($[0, 0]<=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, name, equal", + "selector": "$[?($['a', 'a']==42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, name, not equal", + "selector": "$[?($['a', 'a']!=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, name, less-or-equal", + "selector": "$[?($['a', 'a']<=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, combined, equal", + "selector": "$[?($[0, '0']==42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, combined, not equal", + "selector": "$[?($[0, '0']!=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, combined, less-or-equal", + "selector": "$[?($[0, '0']<=42)]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, absolute non-singular query, wildcard, equal", + "selector": "$[?($.*==42)]", + "invalid_selector": true + }, + { + "name": "filter, absolute non-singular query, wildcard, not equal", + "selector": "$[?($.*!=42)]", + "invalid_selector": true + }, + { + "name": "filter, absolute non-singular query, wildcard, less-or-equal", + "selector": "$[?($.*<=42)]", + "invalid_selector": true + }, + { + "name": "filter, absolute non-singular query, slice, equal", + "selector": "$[?($[0:0]==42)]", + "invalid_selector": true + }, + { + "name": "filter, absolute non-singular query, slice, not equal", + "selector": "$[?($[0:0]!=42)]", + "invalid_selector": true + }, + { + "name": "filter, absolute non-singular query, slice, less-or-equal", + "selector": "$[?($[0:0]<=42)]", + "invalid_selector": true + }, + { + "name": "filter, multiple selectors", + "selector": "$[?@.a,?@.b]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "filter, multiple selectors, comparison", + "selector": "$[?@.a=='b',?@.b=='x']", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, multiple selectors, overlapping", + "selector": "$[?@.a,?@.d]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + }, + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[0]", + "$[1]" + ] + }, + { + "name": "filter, multiple selectors, filter and index", + "selector": "$[?@.a,1]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ] + }, + { + "name": "filter, multiple selectors, filter and wildcard", + "selector": "$[?@.a,*]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + }, + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[0]", + "$[1]" + ] + }, + { + "name": "filter, multiple selectors, filter and slice", + "selector": "$[?@.a,1:]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + }, + { + "g": "h" + } + ], + "result": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + }, + { + "g": "h" + } + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]" + ] + }, + { + "name": "filter, multiple selectors, comparison filter, index and slice", + "selector": "$[1, ?@.a=='b', 1:]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "b": "c", + "d": "f" + }, + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result_paths": [ + "$[1]", + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, equals number, zero and negative zero", + "selector": "$[?@.a==0]", + "document": [ + { + "a": 0, + "d": "e" + }, + { + "a": 0.1, + "d": "f" + }, + { + "a": "0", + "d": "g" + } + ], + "result": [ + { + "a": 0, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, negative zero and zero", + "selector": "$[?@.a==-0]", + "document": [ + { + "a": 0, + "d": "e" + }, + { + "a": 0.1, + "d": "f" + }, + { + "a": "0", + "d": "g" + } + ], + "result": [ + { + "a": 0, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, with and without decimal fraction", + "selector": "$[?@.a==1.0]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "g" + } + ], + "result": [ + { + "a": 1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, exponent", + "selector": "$[?@.a==1e2]", + "document": [ + { + "a": 100, + "d": "e" + }, + { + "a": 100.1, + "d": "f" + }, + { + "a": "100", + "d": "g" + } + ], + "result": [ + { + "a": 100, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, exponent upper e", + "selector": "$[?@.a==1E2]", + "document": [ + { + "a": 100, + "d": "e" + }, + { + "a": 100.1, + "d": "f" + }, + { + "a": "100", + "d": "g" + } + ], + "result": [ + { + "a": 100, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, positive exponent", + "selector": "$[?@.a==1e+2]", + "document": [ + { + "a": 100, + "d": "e" + }, + { + "a": 100.1, + "d": "f" + }, + { + "a": "100", + "d": "g" + } + ], + "result": [ + { + "a": 100, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, negative exponent", + "selector": "$[?@.a==1e-2]", + "document": [ + { + "a": 0.01, + "d": "e" + }, + { + "a": 0.02, + "d": "f" + }, + { + "a": "0.01", + "d": "g" + } + ], + "result": [ + { + "a": 0.01, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, exponent 0", + "selector": "$[?@.a==1e0]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "g" + } + ], + "result": [ + { + "a": 1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, exponent -0", + "selector": "$[?@.a==1e-0]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "g" + } + ], + "result": [ + { + "a": 1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, exponent +0", + "selector": "$[?@.a==1e+0]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "g" + } + ], + "result": [ + { + "a": 1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, exponent leading -0", + "selector": "$[?@.a==1e-02]", + "document": [ + { + "a": 0.01, + "d": "e" + }, + { + "a": 0.02, + "d": "f" + }, + { + "a": "0.01", + "d": "g" + } + ], + "result": [ + { + "a": 0.01, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, exponent +00", + "selector": "$[?@.a==1e+00]", + "document": [ + { + "a": 1, + "d": "e" + }, + { + "a": 2, + "d": "f" + }, + { + "a": "1", + "d": "g" + } + ], + "result": [ + { + "a": 1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, decimal fraction", + "selector": "$[?@.a==1.1]", + "document": [ + { + "a": 1.1, + "d": "e" + }, + { + "a": 1, + "d": "f" + }, + { + "a": "1.1", + "d": "g" + } + ], + "result": [ + { + "a": 1.1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, decimal fraction, trailing 0", + "selector": "$[?@.a==1.10]", + "document": [ + { + "a": 1.1, + "d": "e" + }, + { + "a": 1, + "d": "f" + }, + { + "a": "1.1", + "d": "g" + } + ], + "result": [ + { + "a": 1.1, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, decimal fraction, exponent", + "selector": "$[?@.a==1.1e2]", + "document": [ + { + "a": 110, + "d": "e" + }, + { + "a": 110.1, + "d": "f" + }, + { + "a": "110", + "d": "g" + } + ], + "result": [ + { + "a": 110, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, decimal fraction, positive exponent", + "selector": "$[?@.a==1.1e+2]", + "document": [ + { + "a": 110, + "d": "e" + }, + { + "a": 110.1, + "d": "f" + }, + { + "a": "110", + "d": "g" + } + ], + "result": [ + { + "a": 110, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, decimal fraction, negative exponent", + "selector": "$[?@.a==1.1e-2]", + "document": [ + { + "a": 0.011, + "d": "e" + }, + { + "a": 0.012, + "d": "f" + }, + { + "a": "0.011", + "d": "g" + } + ], + "result": [ + { + "a": 0.011, + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, equals number, invalid plus", + "selector": "$[?@.a==+1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid minus space", + "selector": "$[?@.a==- 1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid double minus", + "selector": "$[?@.a==--1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid no int digit", + "selector": "$[?@.a==.1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid minus no int digit", + "selector": "$[?@.a==-.1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid 00", + "selector": "$[?@.a==00]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid leading 0", + "selector": "$[?@.a==01]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid no fractional digit", + "selector": "$[?@.a==1.]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid middle minus", + "selector": "$[?@.a==1.-1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid no fractional digit e", + "selector": "$[?@.a==1.e1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid no e digit", + "selector": "$[?@.a==1e]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid no e digit minus", + "selector": "$[?@.a==1e-]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid double e", + "selector": "$[?@.a==1eE1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid e digit double minus", + "selector": "$[?@.a==1e--1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid e digit plus minus", + "selector": "$[?@.a==1e+-1]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid e decimal", + "selector": "$[?@.a==1e2.3]", + "invalid_selector": true + }, + { + "name": "filter, equals number, invalid multi e", + "selector": "$[?@.a==1e2e3]", + "invalid_selector": true + }, + { + "name": "filter, equals, special nothing", + "selector": "$.values[?length(@.a) == value($..c)]", + "document": { + "c": "cd", + "values": [ + { + "a": "ab" + }, + { + "c": "d" + }, + { + "a": null + } + ] + }, + "result": [ + { + "c": "d" + }, + { + "a": null + } + ], + "result_paths": [ + "$['values'][1]", + "$['values'][2]" + ], + "tags": [ + "function" + ] + }, + { + "name": "filter, equals, empty node list and empty node list", + "selector": "$[?@.a == @.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "c": 3 + } + ], + "result_paths": [ + "$[2]" + ] + }, + { + "name": "filter, equals, empty node list and special nothing", + "selector": "$[?@.a == length(@.b)]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "b": 2 + }, + { + "c": 3 + } + ], + "result_paths": [ + "$[1]", + "$[2]" + ], + "tags": [ + "function", + "whitespace" + ] + }, + { + "name": "filter, object data", + "selector": "$[?@<3]", + "document": { + "a": 1, + "b": 2, + "c": 3 + }, + "results": [ + [ + 1, + 2 + ], + [ + 2, + 1 + ] + ], + "results_paths": [ + [ + "$['a']", + "$['b']" + ], + [ + "$['b']", + "$['a']" + ] + ] + }, + { + "name": "filter, and binds more tightly than or", + "selector": "$[?@.a || @.b && @.c]", + "document": [ + { + "a": 1 + }, + { + "b": 2, + "c": 3 + }, + { + "c": 3 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2, + "c": 3 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[4]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, left to right evaluation", + "selector": "$[?@.a && @.b || @.c]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 1, + "c": 3 + }, + { + "b": 1, + "c": 3 + }, + { + "c": 3 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result": [ + { + "a": 1, + "b": 2 + }, + { + "a": 1, + "c": 3 + }, + { + "b": 1, + "c": 3 + }, + { + "c": 3 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result_paths": [ + "$[2]", + "$[3]", + "$[4]", + "$[5]", + "$[6]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, group terms, left", + "selector": "$[?(@.a || @.b) && @.c]", + "document": [ + { + "a": 1, + "b": 2 + }, + { + "a": 1, + "c": 3 + }, + { + "b": 2, + "c": 3 + }, + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result": [ + { + "a": 1, + "c": 3 + }, + { + "b": 2, + "c": 3 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result_paths": [ + "$[1]", + "$[2]", + "$[6]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, group terms, right", + "selector": "$[?@.a && (@.b || @.c)]", + "document": [ + { + "a": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 1, + "c": 2 + }, + { + "b": 2 + }, + { + "c": 2 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result": [ + { + "a": 1, + "b": 2 + }, + { + "a": 1, + "c": 2 + }, + { + "a": 1, + "b": 2, + "c": 3 + } + ], + "result_paths": [ + "$[1]", + "$[2]", + "$[5]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, string literal, single quote in double quotes", + "selector": "$[?@ == \"quoted' literal\"]", + "document": [ + "quoted' literal", + "a", + "quoted\\' literal" + ], + "result": [ + "quoted' literal" + ], + "result_paths": [ + "$[0]" + ] + }, + { + "name": "filter, string literal, double quote in single quotes", + "selector": "$[?@ == 'quoted\" literal']", + "document": [ + "quoted\" literal", + "a", + "quoted\\\" literal", + "'quoted\" literal'" + ], + "result": [ + "quoted\" literal" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, string literal, escaped single quote in single quotes", + "selector": "$[?@ == 'quoted\\' literal']", + "document": [ + "quoted' literal", + "a", + "quoted\\' literal", + "'quoted\" literal'" + ], + "result": [ + "quoted' literal" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, string literal, escaped double quote in double quotes", + "selector": "$[?@ == \"quoted\\\" literal\"]", + "document": [ + "quoted\" literal", + "a", + "quoted\\\" literal", + "'quoted\" literal'" + ], + "result": [ + "quoted\" literal" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, literal true must be compared", + "selector": "$[?true]", + "invalid_selector": true + }, + { + "name": "filter, literal false must be compared", + "selector": "$[?false]", + "invalid_selector": true + }, + { + "name": "filter, literal string must be compared", + "selector": "$[?'abc']", + "invalid_selector": true + }, + { + "name": "filter, literal int must be compared", + "selector": "$[?2]", + "invalid_selector": true + }, + { + "name": "filter, literal float must be compared", + "selector": "$[?2.2]", + "invalid_selector": true + }, + { + "name": "filter, literal null must be compared", + "selector": "$[?null]", + "invalid_selector": true + }, + { + "name": "filter, and, literals must be compared", + "selector": "$[?true && false]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, or, literals must be compared", + "selector": "$[?true || false]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, and, right hand literal must be compared", + "selector": "$[?true == false && false]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, or, right hand literal must be compared", + "selector": "$[?true == false || false]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, and, left hand literal must be compared", + "selector": "$[?false && true == false]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, or, left hand literal must be compared", + "selector": "$[?false || true == false]", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "filter, true, incorrectly capitalized", + "selector": "$[?@==True]", + "invalid_selector": true, + "tags": [ + "case" + ] + }, + { + "name": "filter, false, incorrectly capitalized", + "selector": "$[?@==False]", + "invalid_selector": true, + "tags": [ + "case" + ] + }, + { + "name": "filter, null, incorrectly capitalized", + "selector": "$[?@==Null]", + "invalid_selector": true, + "tags": [ + "case" + ] + }, + { + "name": "index selector, first element", + "selector": "$[0]", + "document": [ + "first", + "second" + ], + "result": [ + "first" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "index" + ] + }, + { + "name": "index selector, second element", + "selector": "$[1]", + "document": [ + "first", + "second" + ], + "result": [ + "second" + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "index" + ] + }, + { + "name": "index selector, out of bound", + "selector": "$[2]", + "document": [ + "first", + "second" + ], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "index" + ] + }, + { + "name": "index selector, min exact index", + "selector": "$[-9007199254740991]", + "document": [ + "first", + "second" + ], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "index" + ] + }, + { + "name": "index selector, max exact index", + "selector": "$[9007199254740991]", + "document": [ + "first", + "second" + ], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "index" + ] + }, + { + "name": "index selector, min exact index - 1", + "selector": "$[-9007199254740992]", + "invalid_selector": true, + "tags": [ + "boundary", + "index" + ] + }, + { + "name": "index selector, max exact index + 1", + "selector": "$[9007199254740992]", + "invalid_selector": true, + "tags": [ + "boundary", + "index" + ] + }, + { + "name": "index selector, overflowing index", + "selector": "$[231584178474632390847141970017375815706539969331281128078915168015826259279872]", + "invalid_selector": true, + "tags": [ + "boundary", + "index" + ] + }, + { + "name": "index selector, not actually an index, overflowing index leads into general text", + "selector": "$[231584178474632390847141970017375815706539969331281128078915168SomeRandomText]", + "invalid_selector": true, + "tags": [ + "index" + ] + }, + { + "name": "index selector, negative", + "selector": "$[-1]", + "document": [ + "first", + "second" + ], + "result": [ + "second" + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "index" + ] + }, + { + "name": "index selector, more negative", + "selector": "$[-2]", + "document": [ + "first", + "second" + ], + "result": [ + "first" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "index" + ] + }, + { + "name": "index selector, negative out of bound", + "selector": "$[-3]", + "document": [ + "first", + "second" + ], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "index" + ] + }, + { + "name": "index selector, on object", + "selector": "$[0]", + "document": { + "foo": 1 + }, + "result": [], + "result_paths": [], + "tags": [ + "index" + ] + }, + { + "name": "index selector, leading 0", + "selector": "$[01]", + "invalid_selector": true, + "tags": [ + "index" + ] + }, + { + "name": "index selector, decimal", + "selector": "$[1.0]", + "invalid_selector": true, + "tags": [ + "index" + ] + }, + { + "name": "index selector, plus", + "selector": "$[+1]", + "invalid_selector": true, + "tags": [ + "index" + ] + }, + { + "name": "index selector, minus space", + "selector": "$[- 1]", + "invalid_selector": true, + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "index selector, -0", + "selector": "$[-0]", + "invalid_selector": true, + "tags": [ + "index" + ] + }, + { + "name": "index selector, leading -0", + "selector": "$[-01]", + "invalid_selector": true, + "tags": [ + "index" + ] + }, + { + "name": "name selector, double quotes", + "selector": "$[\"a\"]", + "document": { + "a": "A", + "b": "B" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['a']" + ] + }, + { + "name": "name selector, double quotes, absent data", + "selector": "$[\"c\"]", + "document": { + "a": "A", + "b": "B" + }, + "result": [], + "result_paths": [] + }, + { + "name": "name selector, double quotes, array data", + "selector": "$[\"a\"]", + "document": [ + "first", + "second" + ], + "result": [], + "result_paths": [] + }, + { + "name": "name selector, name, double quotes, contains single quote", + "selector": "$[\"a'\"]", + "document": { + "a'": "A", + "b": "B" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['a\\'']" + ] + }, + { + "name": "name selector, name, double quotes, nested", + "selector": "$[\"a\"][\"b\"][\"c\"]", + "document": { + "a": { + "b": { + "c": "C" + } + } + }, + "result": [ + "C" + ], + "result_paths": [ + "$['a']['b']['c']" + ] + }, + { + "name": "name selector, double quotes, embedded U+0000", + "selector": "$[\"\u0000\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0001", + "selector": "$[\"\u0001\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0002", + "selector": "$[\"\u0002\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0003", + "selector": "$[\"\u0003\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0004", + "selector": "$[\"\u0004\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0005", + "selector": "$[\"\u0005\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0006", + "selector": "$[\"\u0006\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0007", + "selector": "$[\"\u0007\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0008", + "selector": "$[\"\b\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0009", + "selector": "$[\"\t\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+000A", + "selector": "$[\"\n\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+000B", + "selector": "$[\"\u000b\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+000C", + "selector": "$[\"\f\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+000D", + "selector": "$[\"\r\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+000E", + "selector": "$[\"\u000e\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+000F", + "selector": "$[\"\u000f\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0010", + "selector": "$[\"\u0010\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0011", + "selector": "$[\"\u0011\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0012", + "selector": "$[\"\u0012\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0013", + "selector": "$[\"\u0013\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0014", + "selector": "$[\"\u0014\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0015", + "selector": "$[\"\u0015\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0016", + "selector": "$[\"\u0016\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0017", + "selector": "$[\"\u0017\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0018", + "selector": "$[\"\u0018\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0019", + "selector": "$[\"\u0019\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+001A", + "selector": "$[\"\u001a\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+001B", + "selector": "$[\"\u001b\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+001C", + "selector": "$[\"\u001c\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+001D", + "selector": "$[\"\u001d\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+001E", + "selector": "$[\"\u001e\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+001F", + "selector": "$[\"\u001f\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+0020", + "selector": "$[\" \"]", + "document": { + " ": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$[' ']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, embedded U+007F", + "selector": "$[\"\"]", + "document": { + "": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, supplementary plane character", + "selector": "$[\"𝄞\"]", + "document": { + "𝄞": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['𝄞']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, escaped double quote", + "selector": "$[\"\\\"\"]", + "document": { + "\"": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\"']" + ] + }, + { + "name": "name selector, double quotes, escaped reverse solidus", + "selector": "$[\"\\\\\"]", + "document": { + "\\": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\\\']" + ] + }, + { + "name": "name selector, double quotes, escaped solidus", + "selector": "$[\"\\/\"]", + "document": { + "/": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['/']" + ] + }, + { + "name": "name selector, double quotes, escaped backspace", + "selector": "$[\"\\b\"]", + "document": { + "\b": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\b']" + ] + }, + { + "name": "name selector, double quotes, escaped form feed", + "selector": "$[\"\\f\"]", + "document": { + "\f": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\f']" + ] + }, + { + "name": "name selector, double quotes, escaped line feed", + "selector": "$[\"\\n\"]", + "document": { + "\n": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\n']" + ] + }, + { + "name": "name selector, double quotes, escaped carriage return", + "selector": "$[\"\\r\"]", + "document": { + "\r": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\r']" + ] + }, + { + "name": "name selector, double quotes, escaped tab", + "selector": "$[\"\\t\"]", + "document": { + "\t": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\t']" + ] + }, + { + "name": "name selector, double quotes, escaped ☺, upper case hex", + "selector": "$[\"\\u263A\"]", + "document": { + "☺": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['☺']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, escaped ☺, lower case hex", + "selector": "$[\"\\u263a\"]", + "document": { + "☺": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['☺']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, surrogate pair 𝄞", + "selector": "$[\"\\uD834\\uDD1E\"]", + "document": { + "𝄞": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['𝄞']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, surrogate pair 😀", + "selector": "$[\"\\uD83D\\uDE00\"]", + "document": { + "😀": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['😀']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, before high surrogates", + "selector": "$[\"\\uD7FF\\uD7FF\"]", + "document": { + "퟿퟿": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['퟿퟿']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, after low surrogates", + "selector": "$[\"\\uE000\\uE000\"]", + "document": { + "": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, invalid escaped single quote", + "selector": "$[\"\\'\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, embedded double quote", + "selector": "$[\"\"\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, incomplete escape", + "selector": "$[\"\\\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, escape at end of line", + "selector": "$[\"\\\n\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, question mark escape", + "selector": "$[\"\\?\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, bell escape", + "selector": "$[\"\\a\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, vertical tab escape", + "selector": "$[\"\\v\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, 0 escape", + "selector": "$[\"\\0\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, x escape", + "selector": "$[\"\\x12\"]", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, n escape", + "selector": "$[\"\\N{LATIN CAPITAL LETTER A}\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, unicode escape no hex", + "selector": "$[\"\\u\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, unicode escape too few hex", + "selector": "$[\"\\u123\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, unicode escape upper u", + "selector": "$[\"\\U1234\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, unicode escape upper u long", + "selector": "$[\"\\U0010FFFF\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, unicode escape plus", + "selector": "$[\"\\u+1234\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, unicode escape brackets", + "selector": "$[\"\\u{1234}\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, unicode escape brackets long", + "selector": "$[\"\\u{10ffff}\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, single high surrogate", + "selector": "$[\"\\uD800\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, single low surrogate", + "selector": "$[\"\\uDC00\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, high high surrogate", + "selector": "$[\"\\uD800\\uD800\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, low low surrogate", + "selector": "$[\"\\uDC00\\uDC00\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, surrogate non-surrogate", + "selector": "$[\"\\uD800\\u1234\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, non-surrogate surrogate", + "selector": "$[\"\\u1234\\uDC00\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, surrogate supplementary", + "selector": "$[\"\\uD800𝄞\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, supplementary surrogate", + "selector": "$[\"𝄞\\uDC00\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, double quotes, surrogate incomplete low", + "selector": "$[\"\\uD800\\uDC0\"]", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes", + "selector": "$['a']", + "document": { + "a": "A", + "b": "B" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['a']" + ] + }, + { + "name": "name selector, single quotes, absent data", + "selector": "$['c']", + "document": { + "a": "A", + "b": "B" + }, + "result": [], + "result_paths": [] + }, + { + "name": "name selector, single quotes, array data", + "selector": "$['a']", + "document": [ + "first", + "second" + ], + "result": [], + "result_paths": [] + }, + { + "name": "name selector, single quotes, embedded U+0000", + "selector": "$['\u0000']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0001", + "selector": "$['\u0001']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0002", + "selector": "$['\u0002']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0003", + "selector": "$['\u0003']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0004", + "selector": "$['\u0004']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0005", + "selector": "$['\u0005']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0006", + "selector": "$['\u0006']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0007", + "selector": "$['\u0007']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0008", + "selector": "$['\b']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0009", + "selector": "$['\t']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+000A", + "selector": "$['\n']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+000B", + "selector": "$['\u000b']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+000C", + "selector": "$['\f']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+000D", + "selector": "$['\r']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+000E", + "selector": "$['\u000e']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+000F", + "selector": "$['\u000f']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0010", + "selector": "$['\u0010']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0011", + "selector": "$['\u0011']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0012", + "selector": "$['\u0012']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0013", + "selector": "$['\u0013']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0014", + "selector": "$['\u0014']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0015", + "selector": "$['\u0015']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0016", + "selector": "$['\u0016']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0017", + "selector": "$['\u0017']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0018", + "selector": "$['\u0018']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0019", + "selector": "$['\u0019']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+001A", + "selector": "$['\u001a']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+001B", + "selector": "$['\u001b']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+001C", + "selector": "$['\u001c']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+001D", + "selector": "$['\u001d']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+001E", + "selector": "$['\u001e']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+001F", + "selector": "$['\u001f']", + "invalid_selector": true, + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, embedded U+0020", + "selector": "$[' ']", + "document": { + " ": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$[' ']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, escaped single quote", + "selector": "$['\\'']", + "document": { + "'": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\'']" + ] + }, + { + "name": "name selector, single quotes, escaped reverse solidus", + "selector": "$['\\\\']", + "document": { + "\\": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\\\']" + ] + }, + { + "name": "name selector, single quotes, escaped solidus", + "selector": "$['\\/']", + "document": { + "/": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['/']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, escaped backspace", + "selector": "$['\\b']", + "document": { + "\b": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\b']" + ] + }, + { + "name": "name selector, single quotes, escaped form feed", + "selector": "$['\\f']", + "document": { + "\f": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\f']" + ] + }, + { + "name": "name selector, single quotes, escaped line feed", + "selector": "$['\\n']", + "document": { + "\n": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\n']" + ] + }, + { + "name": "name selector, single quotes, escaped carriage return", + "selector": "$['\\r']", + "document": { + "\r": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\r']" + ] + }, + { + "name": "name selector, single quotes, escaped tab", + "selector": "$['\\t']", + "document": { + "\t": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['\\t']" + ] + }, + { + "name": "name selector, single quotes, escaped ☺, upper case hex", + "selector": "$['\\u263A']", + "document": { + "☺": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['☺']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, escaped ☺, lower case hex", + "selector": "$['\\u263a']", + "document": { + "☺": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['☺']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, surrogate pair 𝄞", + "selector": "$['\\uD834\\uDD1E']", + "document": { + "𝄞": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['𝄞']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, surrogate pair 😀", + "selector": "$['\\uD83D\\uDE00']", + "document": { + "😀": "A" + }, + "result": [ + "A" + ], + "result_paths": [ + "$['😀']" + ], + "tags": [ + "unicode" + ] + }, + { + "name": "name selector, single quotes, invalid escaped double quote", + "selector": "$['\\\"']", + "invalid_selector": true + }, + { + "name": "name selector, single quotes, embedded single quote", + "selector": "$[''']", + "invalid_selector": true + }, + { + "name": "name selector, single quotes, incomplete escape", + "selector": "$['\\']", + "invalid_selector": true + }, + { + "name": "name selector, double quotes, empty", + "selector": "$[\"\"]", + "document": { + "a": "A", + "b": "B", + "": "C" + }, + "result": [ + "C" + ], + "result_paths": [ + "$['']" + ] + }, + { + "name": "name selector, single quotes, empty", + "selector": "$['']", + "document": { + "a": "A", + "b": "B", + "": "C" + }, + "result": [ + "C" + ], + "result_paths": [ + "$['']" + ] + }, + { + "name": "slice selector, slice selector", + "selector": "$[1:3]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1, + 2 + ], + "result_paths": [ + "$[1]", + "$[2]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, slice selector with step", + "selector": "$[1:6:2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1, + 3, + 5 + ], + "result_paths": [ + "$[1]", + "$[3]", + "$[5]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, slice selector with everything omitted, short form", + "selector": "$[:]", + "document": [ + 0, + 1, + 2, + 3 + ], + "result": [ + 0, + 1, + 2, + 3 + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[3]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, slice selector with everything omitted, long form", + "selector": "$[::]", + "document": [ + 0, + 1, + 2, + 3 + ], + "result": [ + 0, + 1, + 2, + 3 + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[3]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, slice selector with start omitted", + "selector": "$[:2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 0, + 1 + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, slice selector with start and end omitted", + "selector": "$[::2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 0, + 2, + 4, + 6, + 8 + ], + "result_paths": [ + "$[0]", + "$[2]", + "$[4]", + "$[6]", + "$[8]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative step with default start and end", + "selector": "$[::-1]", + "document": [ + 0, + 1, + 2, + 3 + ], + "result": [ + 3, + 2, + 1, + 0 + ], + "result_paths": [ + "$[3]", + "$[2]", + "$[1]", + "$[0]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative step with default start", + "selector": "$[:0:-1]", + "document": [ + 0, + 1, + 2, + 3 + ], + "result": [ + 3, + 2, + 1 + ], + "result_paths": [ + "$[3]", + "$[2]", + "$[1]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative step with default end", + "selector": "$[2::-1]", + "document": [ + 0, + 1, + 2, + 3 + ], + "result": [ + 2, + 1, + 0 + ], + "result_paths": [ + "$[2]", + "$[1]", + "$[0]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, larger negative step", + "selector": "$[::-2]", + "document": [ + 0, + 1, + 2, + 3 + ], + "result": [ + 3, + 1 + ], + "result_paths": [ + "$[3]", + "$[1]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative range with default step", + "selector": "$[-1:-3]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [], + "result_paths": [], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative range with negative step", + "selector": "$[-1:-3:-1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 9, + 8 + ], + "result_paths": [ + "$[9]", + "$[8]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative range with larger negative step", + "selector": "$[-1:-6:-2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 9, + 7, + 5 + ], + "result_paths": [ + "$[9]", + "$[7]", + "$[5]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, larger negative range with larger negative step", + "selector": "$[-1:-7:-2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 9, + 7, + 5 + ], + "result_paths": [ + "$[9]", + "$[7]", + "$[5]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative from, positive to", + "selector": "$[-5:7]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 5, + 6 + ], + "result_paths": [ + "$[5]", + "$[6]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative from", + "selector": "$[-2:]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 8, + 9 + ], + "result_paths": [ + "$[8]", + "$[9]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, positive from, negative to", + "selector": "$[1:-1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "result_paths": [ + "$[1]", + "$[2]", + "$[3]", + "$[4]", + "$[5]", + "$[6]", + "$[7]", + "$[8]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative from, positive to, negative step", + "selector": "$[-1:1:-1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2 + ], + "result_paths": [ + "$[9]", + "$[8]", + "$[7]", + "$[6]", + "$[5]", + "$[4]", + "$[3]", + "$[2]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, positive from, negative to, negative step", + "selector": "$[7:-5:-1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 7, + 6 + ], + "result_paths": [ + "$[7]", + "$[6]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, in serial, on nested array", + "selector": "$[1:3][1:2]", + "document": [ + [ + "a", + "b", + "c" + ], + [ + "d", + "e", + "f" + ], + [ + "g", + "h", + "i" + ] + ], + "result": [ + "e", + "h" + ], + "result_paths": [ + "$[1][1]", + "$[2][1]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, in serial, on flat array", + "selector": "$[1:3][::]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5 + ], + "result": [], + "result_paths": [], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative from, negative to, positive step", + "selector": "$[-5:-2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 5, + 6, + 7 + ], + "result_paths": [ + "$[5]", + "$[6]", + "$[7]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, too many colons", + "selector": "$[1:2:3:4]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, non-integer array index", + "selector": "$[1:2:a]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, zero step", + "selector": "$[1:2:0]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [], + "result_paths": [], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, empty range", + "selector": "$[2:2]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [], + "result_paths": [], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, slice selector with everything omitted with empty array", + "selector": "$[:]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, negative step with empty array", + "selector": "$[::-1]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, maximal range with positive step", + "selector": "$[0:10]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result_paths": [ + "$[0]", + "$[1]", + "$[2]", + "$[3]", + "$[4]", + "$[5]", + "$[6]", + "$[7]", + "$[8]", + "$[9]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, maximal range with negative step", + "selector": "$[9:0:-1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ], + "result_paths": [ + "$[9]", + "$[8]", + "$[7]", + "$[6]", + "$[5]", + "$[4]", + "$[3]", + "$[2]", + "$[1]" + ], + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, excessively large to value", + "selector": "$[2:113667776004]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result_paths": [ + "$[2]", + "$[3]", + "$[4]", + "$[5]", + "$[6]", + "$[7]", + "$[8]", + "$[9]" + ], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, excessively small from value", + "selector": "$[-113667776004:1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 0 + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, excessively large from value with negative step", + "selector": "$[113667776004:0:-1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ], + "result_paths": [ + "$[9]", + "$[8]", + "$[7]", + "$[6]", + "$[5]", + "$[4]", + "$[3]", + "$[2]", + "$[1]" + ], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, excessively small to value with negative step", + "selector": "$[3:-113667776004:-1]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 3, + 2, + 1, + 0 + ], + "result_paths": [ + "$[3]", + "$[2]", + "$[1]", + "$[0]" + ], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, excessively large step", + "selector": "$[1:10:113667776004]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 1 + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, excessively small step", + "selector": "$[-1:-10:-113667776004]", + "document": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "result": [ + 9 + ], + "result_paths": [ + "$[9]" + ], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, start, min exact", + "selector": "$[-9007199254740991::]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, start, max exact", + "selector": "$[9007199254740991::]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, start, min exact - 1", + "selector": "$[-9007199254740992::]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, start, max exact + 1", + "selector": "$[9007199254740992::]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, end, min exact", + "selector": "$[:-9007199254740991:]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, end, max exact", + "selector": "$[:9007199254740991:]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, end, min exact - 1", + "selector": "$[:-9007199254740992:]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, end, max exact + 1", + "selector": "$[:9007199254740992:]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, step, min exact", + "selector": "$[::-9007199254740991]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, step, max exact", + "selector": "$[::9007199254740991]", + "document": [], + "result": [], + "result_paths": [], + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, step, min exact - 1", + "selector": "$[::-9007199254740992]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, step, max exact + 1", + "selector": "$[::9007199254740992]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, overflowing to value", + "selector": "$[2:231584178474632390847141970017375815706539969331281128078915168015826259279872]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, underflowing from value", + "selector": "$[-231584178474632390847141970017375815706539969331281128078915168015826259279872:1]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, overflowing from value with negative step", + "selector": "$[231584178474632390847141970017375815706539969331281128078915168015826259279872:0:-1]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, underflowing to value with negative step", + "selector": "$[3:-231584178474632390847141970017375815706539969331281128078915168015826259279872:-1]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, overflowing step", + "selector": "$[1:10:231584178474632390847141970017375815706539969331281128078915168015826259279872]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, underflowing step", + "selector": "$[-1:-10:-231584178474632390847141970017375815706539969331281128078915168015826259279872]", + "invalid_selector": true, + "tags": [ + "boundary", + "slice" + ] + }, + { + "name": "slice selector, start, leading 0", + "selector": "$[01::]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, start, decimal", + "selector": "$[1.0::]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, start, plus", + "selector": "$[+1::]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, start, minus space", + "selector": "$[- 1::]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, start, -0", + "selector": "$[-0::]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, start, leading -0", + "selector": "$[-01::]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, end, leading 0", + "selector": "$[:01:]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, end, decimal", + "selector": "$[:1.0:]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, end, plus", + "selector": "$[:+1:]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, end, minus space", + "selector": "$[:- 1:]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, end, -0", + "selector": "$[:-0:]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, end, leading -0", + "selector": "$[:-01:]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, step, leading 0", + "selector": "$[::01]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, step, decimal", + "selector": "$[::1.0]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, step, plus", + "selector": "$[::+1]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, step, minus space", + "selector": "$[::- 1]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, step, -0", + "selector": "$[::-0]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "slice selector, step, leading -0", + "selector": "$[::-01]", + "invalid_selector": true, + "tags": [ + "slice" + ] + }, + { + "name": "functions, count, count function", + "selector": "$[?count(@..*)>2]", + "document": [ + { + "a": [ + 1, + 2, + 3 + ] + }, + { + "a": [ + 1 + ], + "d": "f" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": [ + 1, + 2, + 3 + ] + }, + { + "a": [ + 1 + ], + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, single-node arg", + "selector": "$[?count(@.a)>1]", + "document": [ + { + "a": [ + 1, + 2, + 3 + ] + }, + { + "a": [ + 1 + ], + "d": "f" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, multiple-selector arg", + "selector": "$[?count(@['a','d'])>1]", + "document": [ + { + "a": [ + 1, + 2, + 3 + ] + }, + { + "a": [ + 1 + ], + "d": "f" + }, + { + "a": 1, + "d": "f" + } + ], + "result": [ + { + "a": [ + 1 + ], + "d": "f" + }, + { + "a": 1, + "d": "f" + } + ], + "result_paths": [ + "$[1]", + "$[2]" + ], + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, non-query arg, number", + "selector": "$[?count(1)>2]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, non-query arg, string", + "selector": "$[?count('string')>2]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, non-query arg, true", + "selector": "$[?count(true)>2]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, non-query arg, false", + "selector": "$[?count(false)>2]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, non-query arg, null", + "selector": "$[?count(null)>2]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, result must be compared", + "selector": "$[?count(@..*)]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, no params", + "selector": "$[?count()==1]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, count, too many params", + "selector": "$[?count(@.a,@.b)==1]", + "invalid_selector": true, + "tags": [ + "count", + "function" + ] + }, + { + "name": "functions, length, string data", + "selector": "$[?length(@.a)>=2]", + "document": [ + { + "a": "ab" + }, + { + "a": "d" + } + ], + "result": [ + { + "a": "ab" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, string data, unicode", + "selector": "$[?length(@)==2]", + "document": [ + "☺", + "☺☺", + "☺☺☺", + "ж", + "жж", + "жжж", + "磨", + "阿美", + "形声字" + ], + "result": [ + "☺☺", + "жж", + "阿美" + ], + "result_paths": [ + "$[1]", + "$[4]", + "$[7]" + ], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, array data", + "selector": "$[?length(@.a)>=2]", + "document": [ + { + "a": [ + 1, + 2, + 3 + ] + }, + { + "a": [ + 1 + ] + } + ], + "result": [ + { + "a": [ + 1, + 2, + 3 + ] + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, missing data", + "selector": "$[?length(@.a)>=2]", + "document": [ + { + "d": "f" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, number arg", + "selector": "$[?length(1)>=2]", + "document": [ + { + "d": "f" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, true arg", + "selector": "$[?length(true)>=2]", + "document": [ + { + "d": "f" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, false arg", + "selector": "$[?length(false)>=2]", + "document": [ + { + "d": "f" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, null arg", + "selector": "$[?length(null)>=2]", + "document": [ + { + "d": "f" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, result must be compared", + "selector": "$[?length(@.a)]", + "invalid_selector": true, + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, no params", + "selector": "$[?length()==1]", + "invalid_selector": true, + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, too many params", + "selector": "$[?length(@.a,@.b)==1]", + "invalid_selector": true, + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, non-singular query arg", + "selector": "$[?length(@.*)<3]", + "invalid_selector": true, + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, arg is a function expression", + "selector": "$.values[?length(@.a)==length(value($..c))]", + "document": { + "c": "cd", + "values": [ + { + "a": "ab" + }, + { + "a": "d" + } + ] + }, + "result": [ + { + "a": "ab" + } + ], + "result_paths": [ + "$['values'][0]" + ], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, length, arg is special nothing", + "selector": "$[?length(value(@.a))>0]", + "document": [ + { + "a": "ab" + }, + { + "c": "d" + }, + { + "a": null + } + ], + "result": [ + { + "a": "ab" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "length" + ] + }, + { + "name": "functions, match, found match", + "selector": "$[?match(@.a, 'a.*')]", + "document": [ + { + "a": "ab" + } + ], + "result": [ + { + "a": "ab" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, double quotes", + "selector": "$[?match(@.a, \"a.*\")]", + "document": [ + { + "a": "ab" + } + ], + "result": [ + { + "a": "ab" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, regex from the document", + "selector": "$.values[?match(@, $.regex)]", + "document": { + "regex": "b.?b", + "values": [ + "abc", + "bcd", + "bab", + "bba", + "bbab", + "b", + true, + [], + {} + ] + }, + "result": [ + "bab" + ], + "result_paths": [ + "$['values'][2]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, don't select match", + "selector": "$[?!match(@.a, 'a.*')]", + "document": [ + { + "a": "ab" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, not a match", + "selector": "$[?match(@.a, 'a.*')]", + "document": [ + { + "a": "bc" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, select non-match", + "selector": "$[?!match(@.a, 'a.*')]", + "document": [ + { + "a": "bc" + } + ], + "result": [ + { + "a": "bc" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, non-string first arg", + "selector": "$[?match(1, 'a.*')]", + "document": [ + { + "a": "bc" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, non-string second arg", + "selector": "$[?match(@.a, 1)]", + "document": [ + { + "a": "bc" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, filter, match function, unicode char class, uppercase", + "selector": "$[?match(@, '\\\\p{Lu}')]", + "document": [ + "ж", + "Ж", + "1", + "жЖ", + true, + [], + {} + ], + "result": [ + "Ж" + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, filter, match function, unicode char class negated, uppercase", + "selector": "$[?match(@, '\\\\P{Lu}')]", + "document": [ + "ж", + "Ж", + "1", + true, + [], + {} + ], + "result": [ + "ж", + "1" + ], + "result_paths": [ + "$[0]", + "$[2]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, filter, match function, unicode, surrogate pair", + "selector": "$[?match(@, 'a.b')]", + "document": [ + "a𐄁b", + "ab", + "1", + true, + [], + {} + ], + "result": [ + "a𐄁b" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, dot matcher on \\u2028", + "selector": "$[?match(@, '.')]", + "document": [ + "
", + "\r", + "\n", + true, + [], + {} + ], + "result": [ + "
" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, dot matcher on \\u2029", + "selector": "$[?match(@, '.')]", + "document": [ + "
", + "\r", + "\n", + true, + [], + {} + ], + "result": [ + "
" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, result cannot be compared", + "selector": "$[?match(@.a, 'a.*')==true]", + "invalid_selector": true, + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, too few params", + "selector": "$[?match(@.a)==1]", + "invalid_selector": true, + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, too many params", + "selector": "$[?match(@.a,@.b,@.c)==1]", + "invalid_selector": true, + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, arg is a function expression", + "selector": "$.values[?match(@.a, value($..['regex']))]", + "document": { + "regex": "a.*", + "values": [ + { + "a": "ab" + }, + { + "a": "ba" + } + ] + }, + "result": [ + { + "a": "ab" + } + ], + "result_paths": [ + "$['values'][0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, dot in character class", + "selector": "$[?match(@, 'a[.b]c')]", + "document": [ + "abc", + "a.c", + "axc" + ], + "result": [ + "abc", + "a.c" + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, escaped dot", + "selector": "$[?match(@, 'a\\\\.c')]", + "document": [ + "abc", + "a.c", + "axc" + ], + "result": [ + "a.c" + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, escaped backslash before dot", + "selector": "$[?match(@, 'a\\\\\\\\.c')]", + "document": [ + "abc", + "a.c", + "axc", + "a\\
c" + ], + "result": [ + "a\\
c" + ], + "result_paths": [ + "$[3]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, escaped left square bracket", + "selector": "$[?match(@, 'a\\\\[.c')]", + "document": [ + "abc", + "a.c", + "a[
c" + ], + "result": [ + "a[
c" + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, escaped right square bracket", + "selector": "$[?match(@, 'a[\\\\].]c')]", + "document": [ + "abc", + "a.c", + "a
c", + "a]c" + ], + "result": [ + "a.c", + "a]c" + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, explicit caret", + "selector": "$[?match(@, '^ab.*')]", + "document": [ + "abc", + "axc", + "ab", + "xab" + ], + "result": [ + "abc", + "ab" + ], + "result_paths": [ + "$[0]", + "$[2]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, match, explicit dollar", + "selector": "$[?match(@, '.*bc$')]", + "document": [ + "abc", + "axc", + "ab", + "abcx" + ], + "result": [ + "abc" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "match" + ] + }, + { + "name": "functions, search, at the end", + "selector": "$[?search(@.a, 'a.*')]", + "document": [ + { + "a": "the end is ab" + } + ], + "result": [ + { + "a": "the end is ab" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, double quotes", + "selector": "$[?search(@.a, \"a.*\")]", + "document": [ + { + "a": "the end is ab" + } + ], + "result": [ + { + "a": "the end is ab" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, at the start", + "selector": "$[?search(@.a, 'a.*')]", + "document": [ + { + "a": "ab is at the start" + } + ], + "result": [ + { + "a": "ab is at the start" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, in the middle", + "selector": "$[?search(@.a, 'a.*')]", + "document": [ + { + "a": "contains two matches" + } + ], + "result": [ + { + "a": "contains two matches" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, regex from the document", + "selector": "$.values[?search(@, $.regex)]", + "document": { + "regex": "b.?b", + "values": [ + "abc", + "bcd", + "bab", + "bba", + "bbab", + "b", + true, + [], + {} + ] + }, + "result": [ + "bab", + "bba", + "bbab" + ], + "result_paths": [ + "$['values'][2]", + "$['values'][3]", + "$['values'][4]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, don't select match", + "selector": "$[?!search(@.a, 'a.*')]", + "document": [ + { + "a": "contains two matches" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, not a match", + "selector": "$[?search(@.a, 'a.*')]", + "document": [ + { + "a": "bc" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, select non-match", + "selector": "$[?!search(@.a, 'a.*')]", + "document": [ + { + "a": "bc" + } + ], + "result": [ + { + "a": "bc" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, non-string first arg", + "selector": "$[?search(1, 'a.*')]", + "document": [ + { + "a": "bc" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, non-string second arg", + "selector": "$[?search(@.a, 1)]", + "document": [ + { + "a": "bc" + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, filter, search function, unicode char class, uppercase", + "selector": "$[?search(@, '\\\\p{Lu}')]", + "document": [ + "ж", + "Ж", + "1", + "жЖ", + true, + [], + {} + ], + "result": [ + "Ж", + "жЖ" + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, filter, search function, unicode char class negated, uppercase", + "selector": "$[?search(@, '\\\\P{Lu}')]", + "document": [ + "ж", + "Ж", + "1", + true, + [], + {} + ], + "result": [ + "ж", + "1" + ], + "result_paths": [ + "$[0]", + "$[2]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, filter, search function, unicode, surrogate pair", + "selector": "$[?search(@, 'a.b')]", + "document": [ + "a𐄁bc", + "abc", + "1", + true, + [], + {} + ], + "result": [ + "a𐄁bc" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, dot matcher on \\u2028", + "selector": "$[?search(@, '.')]", + "document": [ + "
", + "\r
\n", + "\r", + "\n", + true, + [], + {} + ], + "result": [ + "
", + "\r
\n" + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, dot matcher on \\u2029", + "selector": "$[?search(@, '.')]", + "document": [ + "
", + "\r
\n", + "\r", + "\n", + true, + [], + {} + ], + "result": [ + "
", + "\r
\n" + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, result cannot be compared", + "selector": "$[?search(@.a, 'a.*')==true]", + "invalid_selector": true, + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, too few params", + "selector": "$[?search(@.a)]", + "invalid_selector": true, + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, too many params", + "selector": "$[?search(@.a,@.b,@.c)]", + "invalid_selector": true, + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, arg is a function expression", + "selector": "$.values[?search(@, value($..['regex']))]", + "document": { + "regex": "b.?b", + "values": [ + "abc", + "bcd", + "bab", + "bba", + "bbab", + "b", + true, + [], + {} + ] + }, + "result": [ + "bab", + "bba", + "bbab" + ], + "result_paths": [ + "$['values'][2]", + "$['values'][3]", + "$['values'][4]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, dot in character class", + "selector": "$[?search(@, 'a[.b]c')]", + "document": [ + "x abc y", + "x a.c y", + "x axc y" + ], + "result": [ + "x abc y", + "x a.c y" + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, escaped dot", + "selector": "$[?search(@, 'a\\\\.c')]", + "document": [ + "x abc y", + "x a.c y", + "x axc y" + ], + "result": [ + "x a.c y" + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, escaped backslash before dot", + "selector": "$[?search(@, 'a\\\\\\\\.c')]", + "document": [ + "x abc y", + "x a.c y", + "x axc y", + "x a\\
c y" + ], + "result": [ + "x a\\
c y" + ], + "result_paths": [ + "$[3]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, escaped left square bracket", + "selector": "$[?search(@, 'a\\\\[.c')]", + "document": [ + "x abc y", + "x a.c y", + "x a[
c y" + ], + "result": [ + "x a[
c y" + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, search, escaped right square bracket", + "selector": "$[?search(@, 'a[\\\\].]c')]", + "document": [ + "x abc y", + "x a.c y", + "x a
c y", + "x a]c y" + ], + "result": [ + "x a.c y", + "x a]c y" + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "function", + "search" + ] + }, + { + "name": "functions, value, single-value nodelist", + "selector": "$[?value(@.*)==4]", + "document": [ + [ + 4 + ], + { + "foo": 4 + }, + [ + 5 + ], + { + "foo": 5 + }, + 4 + ], + "result": [ + [ + 4 + ], + { + "foo": 4 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "function", + "value" + ] + }, + { + "name": "functions, value, multi-value nodelist", + "selector": "$[?value(@.*)==4]", + "document": [ + [ + 4, + 4 + ], + { + "foo": 4, + "bar": 4 + } + ], + "result": [], + "result_paths": [], + "tags": [ + "function", + "value" + ] + }, + { + "name": "functions, value, too few params", + "selector": "$[?value()==4]", + "invalid_selector": true, + "tags": [ + "function", + "value" + ] + }, + { + "name": "functions, value, too many params", + "selector": "$[?value(@.a,@.b)==4]", + "invalid_selector": true, + "tags": [ + "function", + "value" + ] + }, + { + "name": "functions, value, result must be compared", + "selector": "$[?value(@.a)]", + "invalid_selector": true, + "tags": [ + "function", + "value" + ] + }, + { + "name": "whitespace, filter, space between question mark and expression", + "selector": "$[? @.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, newline between question mark and expression", + "selector": "$[?\n@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, tab between question mark and expression", + "selector": "$[?\t@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, return between question mark and expression", + "selector": "$[?\r@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, space between question mark and parenthesized expression", + "selector": "$[? (@.a)]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, newline between question mark and parenthesized expression", + "selector": "$[?\n(@.a)]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, tab between question mark and parenthesized expression", + "selector": "$[?\t(@.a)]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, return between question mark and parenthesized expression", + "selector": "$[?\r(@.a)]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, space between parenthesized expression and bracket", + "selector": "$[?(@.a) ]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, newline between parenthesized expression and bracket", + "selector": "$[?(@.a)\n]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, tab between parenthesized expression and bracket", + "selector": "$[?(@.a)\t]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, return between parenthesized expression and bracket", + "selector": "$[?(@.a)\r]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, space between bracket and question mark", + "selector": "$[ ?@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, newline between bracket and question mark", + "selector": "$[\n?@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, tab between bracket and question mark", + "selector": "$[\t?@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, filter, return between bracket and question mark", + "selector": "$[\r?@.a]", + "document": [ + { + "a": "b", + "d": "e" + }, + { + "b": "c", + "d": "f" + } + ], + "result": [ + { + "a": "b", + "d": "e" + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, functions, space between function name and parenthesis", + "selector": "$[?count (@.*)==1]", + "invalid_selector": true, + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, newline between function name and parenthesis", + "selector": "$[?count\n(@.*)==1]", + "invalid_selector": true, + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, tab between function name and parenthesis", + "selector": "$[?count\t(@.*)==1]", + "invalid_selector": true, + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, return between function name and parenthesis", + "selector": "$[?count\r(@.*)==1]", + "invalid_selector": true, + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, space between parenthesis and arg", + "selector": "$[?count( @.*)==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, newline between parenthesis and arg", + "selector": "$[?count(\n@.*)==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, tab between parenthesis and arg", + "selector": "$[?count(\t@.*)==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, return between parenthesis and arg", + "selector": "$[?count(\r@.*)==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, space between arg and comma", + "selector": "$[?search(@ ,'[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, newline between arg and comma", + "selector": "$[?search(@\n,'[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, tab between arg and comma", + "selector": "$[?search(@\t,'[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, return between arg and comma", + "selector": "$[?search(@\r,'[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, space between comma and arg", + "selector": "$[?search(@, '[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, newline between comma and arg", + "selector": "$[?search(@,\n'[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, tab between comma and arg", + "selector": "$[?search(@,\t'[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, return between comma and arg", + "selector": "$[?search(@,\r'[a-z]+')]", + "document": [ + "foo", + "123" + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, space between arg and parenthesis", + "selector": "$[?count(@.* )==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "function", + "search", + "whitespace" + ] + }, + { + "name": "whitespace, functions, newline between arg and parenthesis", + "selector": "$[?count(@.*\n)==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, tab between arg and parenthesis", + "selector": "$[?count(@.*\t)==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, return between arg and parenthesis", + "selector": "$[?count(@.*\r)==1]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "count", + "function", + "whitespace" + ] + }, + { + "name": "whitespace, functions, spaces in a relative singular selector", + "selector": "$[?length(@ .a .b) == 3]", + "document": [ + { + "a": { + "b": "foo" + } + }, + {} + ], + "result": [ + { + "a": { + "b": "foo" + } + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, functions, newlines in a relative singular selector", + "selector": "$[?length(@\n.a\n.b) == 3]", + "document": [ + { + "a": { + "b": "foo" + } + }, + {} + ], + "result": [ + { + "a": { + "b": "foo" + } + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, functions, tabs in a relative singular selector", + "selector": "$[?length(@\t.a\t.b) == 3]", + "document": [ + { + "a": { + "b": "foo" + } + }, + {} + ], + "result": [ + { + "a": { + "b": "foo" + } + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, functions, returns in a relative singular selector", + "selector": "$[?length(@\r.a\r.b) == 3]", + "document": [ + { + "a": { + "b": "foo" + } + }, + {} + ], + "result": [ + { + "a": { + "b": "foo" + } + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, functions, spaces in an absolute singular selector", + "selector": "$..[?length(@)==length($ [0] .a)]", + "document": [ + { + "a": "foo" + }, + {} + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]['a']" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, functions, newlines in an absolute singular selector", + "selector": "$..[?length(@)==length($\n[0]\n.a)]", + "document": [ + { + "a": "foo" + }, + {} + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]['a']" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, functions, tabs in an absolute singular selector", + "selector": "$..[?length(@)==length($\t[0]\t.a)]", + "document": [ + { + "a": "foo" + }, + {} + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]['a']" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, functions, returns in an absolute singular selector", + "selector": "$..[?length(@)==length($\r[0]\r.a)]", + "document": [ + { + "a": "foo" + }, + {} + ], + "result": [ + "foo" + ], + "result_paths": [ + "$[0]['a']" + ], + "tags": [ + "function", + "length", + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before ||", + "selector": "$[?@.a ||@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before ||", + "selector": "$[?@.a\n||@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before ||", + "selector": "$[?@.a\t||@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before ||", + "selector": "$[?@.a\r||@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after ||", + "selector": "$[?@.a|| @.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after ||", + "selector": "$[?@.a||\n@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after ||", + "selector": "$[?@.a||\t@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after ||", + "selector": "$[?@.a||\r@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "c": 3 + } + ], + "result": [ + { + "a": 1 + }, + { + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before &&", + "selector": "$[?@.a &&@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before &&", + "selector": "$[?@.a\n&&@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before &&", + "selector": "$[?@.a\t&&@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before &&", + "selector": "$[?@.a\r&&@.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after &&", + "selector": "$[?@.a&& @.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after &&", + "selector": "$[?@.a&& @.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after &&", + "selector": "$[?@.a&& @.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after &&", + "selector": "$[?@.a&& @.b]", + "document": [ + { + "a": 1 + }, + { + "b": 2 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before ==", + "selector": "$[?@.a ==@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before ==", + "selector": "$[?@.a\n==@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before ==", + "selector": "$[?@.a\t==@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before ==", + "selector": "$[?@.a\r==@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after ==", + "selector": "$[?@.a== @.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after ==", + "selector": "$[?@.a==\n@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after ==", + "selector": "$[?@.a==\t@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after ==", + "selector": "$[?@.a==\r@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 1 + } + ], + "result_paths": [ + "$[0]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before !=", + "selector": "$[?@.a !=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before !=", + "selector": "$[?@.a\n!=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before !=", + "selector": "$[?@.a\t!=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before !=", + "selector": "$[?@.a\r!=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after !=", + "selector": "$[?@.a!= @.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after !=", + "selector": "$[?@.a!=\n@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after !=", + "selector": "$[?@.a!=\t@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after !=", + "selector": "$[?@.a!=\r@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before <", + "selector": "$[?@.a <@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before <", + "selector": "$[?@.a\n<@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before <", + "selector": "$[?@.a\t<@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before <", + "selector": "$[?@.a\r<@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after <", + "selector": "$[?@.a< @.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after <", + "selector": "$[?@.a<\n@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after <", + "selector": "$[?@.a<\t@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after <", + "selector": "$[?@.a<\r@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before >", + "selector": "$[?@.b >@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before >", + "selector": "$[?@.b\n>@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before >", + "selector": "$[?@.b\t>@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before >", + "selector": "$[?@.b\r>@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after >", + "selector": "$[?@.b> @.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after >", + "selector": "$[?@.b>\n@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after >", + "selector": "$[?@.b>\t@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after >", + "selector": "$[?@.b>\r@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result": [ + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before <=", + "selector": "$[?@.a <=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before <=", + "selector": "$[?@.a\n<=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before <=", + "selector": "$[?@.a\t<=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before <=", + "selector": "$[?@.a\r<=@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after <=", + "selector": "$[?@.a<= @.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after <=", + "selector": "$[?@.a<=\n@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after <=", + "selector": "$[?@.a<=\t@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after <=", + "selector": "$[?@.a<=\r@.b]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space before >=", + "selector": "$[?@.b >=@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline before >=", + "selector": "$[?@.b\n>=@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab before >=", + "selector": "$[?@.b\t>=@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return before >=", + "selector": "$[?@.b\r>=@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space after >=", + "selector": "$[?@.b>= @.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline after >=", + "selector": "$[?@.b>=\n@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab after >=", + "selector": "$[?@.b>=\t@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return after >=", + "selector": "$[?@.b>=\r@.a]", + "document": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + }, + { + "a": 2, + "b": 1 + } + ], + "result": [ + { + "a": 1, + "b": 1 + }, + { + "a": 1, + "b": 2 + } + ], + "result_paths": [ + "$[0]", + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space between logical not and test expression", + "selector": "$[?! @.a]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline between logical not and test expression", + "selector": "$[?!\n@.a]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab between logical not and test expression", + "selector": "$[?!\t@.a]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return between logical not and test expression", + "selector": "$[?!\r@.a]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "d": "f" + } + ], + "result_paths": [ + "$[1]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, space between logical not and parenthesized expression", + "selector": "$[?! (@.a=='b')]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "a": "b", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "a", + "d": "e" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, newline between logical not and parenthesized expression", + "selector": "$[?!\n(@.a=='b')]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "a": "b", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "a", + "d": "e" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, tab between logical not and parenthesized expression", + "selector": "$[?!\t(@.a=='b')]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "a": "b", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "a", + "d": "e" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, operators, return between logical not and parenthesized expression", + "selector": "$[?!\r(@.a=='b')]", + "document": [ + { + "a": "a", + "d": "e" + }, + { + "a": "b", + "d": "f" + }, + { + "a": "d", + "d": "f" + } + ], + "result": [ + { + "a": "a", + "d": "e" + }, + { + "a": "d", + "d": "f" + } + ], + "result_paths": [ + "$[0]", + "$[2]" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between root and bracket", + "selector": "$ ['a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between root and bracket", + "selector": "$\n['a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between root and bracket", + "selector": "$\t['a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between root and bracket", + "selector": "$\r['a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between bracket and bracket", + "selector": "$['a'] ['b']", + "document": { + "a": { + "b": "ab" + } + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between bracket and bracket", + "selector": "$['a'] \n['b']", + "document": { + "a": { + "b": "ab" + } + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between bracket and bracket", + "selector": "$['a'] \t['b']", + "document": { + "a": { + "b": "ab" + } + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between bracket and bracket", + "selector": "$['a'] \r['b']", + "document": { + "a": { + "b": "ab" + } + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between root and dot", + "selector": "$ .a", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between root and dot", + "selector": "$\n.a", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between root and dot", + "selector": "$\t.a", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between root and dot", + "selector": "$\r.a", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between dot and name", + "selector": "$. a", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between dot and name", + "selector": "$.\na", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between dot and name", + "selector": "$.\ta", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between dot and name", + "selector": "$.\ra", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between recursive descent and name", + "selector": "$.. a", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between recursive descent and name", + "selector": "$..\na", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between recursive descent and name", + "selector": "$..\ta", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between recursive descent and name", + "selector": "$..\ra", + "invalid_selector": true, + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between bracket and selector", + "selector": "$[ 'a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between bracket and selector", + "selector": "$[\n'a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between bracket and selector", + "selector": "$[\t'a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between bracket and selector", + "selector": "$[\r'a']", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between selector and bracket", + "selector": "$['a' ]", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between selector and bracket", + "selector": "$['a'\n]", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between selector and bracket", + "selector": "$['a'\t]", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between selector and bracket", + "selector": "$['a'\r]", + "document": { + "a": "ab" + }, + "result": [ + "ab" + ], + "result_paths": [ + "$['a']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between selector and comma", + "selector": "$['a' ,'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between selector and comma", + "selector": "$['a'\n,'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between selector and comma", + "selector": "$['a'\t,'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between selector and comma", + "selector": "$['a'\r,'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, space between comma and selector", + "selector": "$['a', 'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, newline between comma and selector", + "selector": "$['a',\n'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, tab between comma and selector", + "selector": "$['a',\t'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, selectors, return between comma and selector", + "selector": "$['a',\r'b']", + "document": { + "a": "ab", + "b": "bc" + }, + "result": [ + "ab", + "bc" + ], + "result_paths": [ + "$['a']", + "$['b']" + ], + "tags": [ + "whitespace" + ] + }, + { + "name": "whitespace, slice, space between start and colon", + "selector": "$[1 :5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, newline between start and colon", + "selector": "$[1\n:5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, tab between start and colon", + "selector": "$[1\t:5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, return between start and colon", + "selector": "$[1\r:5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, space between colon and end", + "selector": "$[1: 5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, newline between colon and end", + "selector": "$[1:\n5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, tab between colon and end", + "selector": "$[1:\t5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, return between colon and end", + "selector": "$[1:\r5:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, space between end and colon", + "selector": "$[1:5 :2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, newline between end and colon", + "selector": "$[1:5\n:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, tab between end and colon", + "selector": "$[1:5\t:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, return between end and colon", + "selector": "$[1:5\r:2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, space between colon and step", + "selector": "$[1:5: 2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, newline between colon and step", + "selector": "$[1:5:\n2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, tab between colon and step", + "selector": "$[1:5:\t2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + }, + { + "name": "whitespace, slice, return between colon and step", + "selector": "$[1:5:\r2]", + "document": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "result": [ + 2, + 4 + ], + "result_paths": [ + "$[1]", + "$[3]" + ], + "tags": [ + "index", + "whitespace" + ] + } + ] +} diff --git a/src/Symfony/Component/JsonPath/Tests/JsonCrawlerTest.php b/src/Symfony/Component/JsonPath/Tests/JsonCrawlerTest.php index 6871a56511890..a52d586fac869 100644 --- a/src/Symfony/Component/JsonPath/Tests/JsonCrawlerTest.php +++ b/src/Symfony/Component/JsonPath/Tests/JsonCrawlerTest.php @@ -49,6 +49,19 @@ public function testAllAuthors() ], $result); } + public function testAllAuthorsWithBrackets() + { + $result = self::getBookstoreCrawler()->find('$..["author"]'); + + $this->assertCount(4, $result); + $this->assertSame([ + 'Nigel Rees', + 'Evelyn Waugh', + 'Herman Melville', + 'J. R. R. Tolkien', + ], $result); + } + public function testAllThingsInStore() { $result = self::getBookstoreCrawler()->find('$.store.*'); @@ -58,6 +71,15 @@ public function testAllThingsInStore() $this->assertArrayHasKey('color', $result[1]); } + public function testAllThingsInStoreWithBrackets() + { + $result = self::getBookstoreCrawler()->find('$["store"][*]'); + + $this->assertCount(2, $result); + $this->assertCount(4, $result[0]); + $this->assertArrayHasKey('color', $result[1]); + } + public function testEscapedDoubleQuotesInFieldName() { $crawler = new JsonCrawler(<<assertSame(42, $result[0]); } + public function testMultipleKeysAtOnce() + { + $crawler = new JsonCrawler(<<find("$['a', 'b', 3]"); + + $this->assertSame([ + ['b"c' => 42], + ['c' => 43], + ], $result); + } + + public function testMultipleKeysAtOnceOnArray() + { + $crawler = new JsonCrawler(<<find("$[0, 2, 'a,b,c', -1]"); + + $this->assertCount(4, $result); + $this->assertSame(['a' => 1], $result[0]); + $this->assertSame(['c' => 3], $result[1]); + $this->assertSame(['a,b,c' => 5], $result[2]); + $this->assertSame(['d' => 4], $result[3]); + } + public function testBasicNameSelector() { $result = self::getBookstoreCrawler()->find('$.store.book')[0]; @@ -77,6 +128,14 @@ public function testBasicNameSelector() $this->assertSame('Nigel Rees', $result[0]['author']); } + public function testBasicNameSelectorWithBrackts() + { + $result = self::getBookstoreCrawler()->find('$["store"]["book"]')[0]; + + $this->assertCount(4, $result); + $this->assertSame('Nigel Rees', $result[0]['author']); + } + public function testAllPrices() { $result = self::getBookstoreCrawler()->find('$.store..price'); @@ -121,6 +180,25 @@ public function testBooksWithIsbn() ], [$result[0]['isbn'], $result[1]['isbn']]); } + public function testBooksWithPublisherAddress() + { + $result = self::getBookstoreCrawler()->find('$..book[?(@.publisher.address)]'); + + $this->assertCount(1, $result); + $this->assertSame('Sword of Honour', $result[0]['title']); + } + + public function testBooksWithBracketsAndFilter() + { + $result = self::getBookstoreCrawler()->find('$..["book"][?(@.isbn)]'); + + $this->assertCount(2, $result); + $this->assertSame([ + '0-553-21311-3', + '0-395-19395-8', + ], [$result[0]['isbn'], $result[1]['isbn']]); + } + public function testBooksLessThanTenDollars() { $result = self::getBookstoreCrawler()->find('$..book[?(@.price < 10)]'); @@ -216,6 +294,14 @@ public function testEverySecondElementReverseSlice() $this->assertSame([6, 2, 5], $result); } + public function testEverySecondElementReverseSliceAndBrackets() + { + $crawler = self::getSimpleCollectionCrawler(); + + $result = $crawler->find('$["a"][::-2]'); + $this->assertSame([6, 2, 5], $result); + } + public function testEmptyResults() { $crawler = self::getSimpleCollectionCrawler(); @@ -344,6 +430,50 @@ public function testValueFunction() $this->assertSame('Sayings of the Century', $result[0]['title']); } + public function testDeepExpressionInFilter() + { + $result = self::getBookstoreCrawler()->find('$.store.book[?(@.publisher.address.city == "Springfield")]'); + + $this->assertCount(1, $result); + $this->assertSame('Sword of Honour', $result[0]['title']); + } + + public function testWildcardInFilter() + { + $result = self::getBookstoreCrawler()->find('$.store.book[?(@.publisher.* == "my-publisher")]'); + + $this->assertCount(1, $result); + $this->assertSame('Sword of Honour', $result[0]['title']); + } + + public function testWildcardInFunction() + { + $result = self::getBookstoreCrawler()->find('$.store.book[?match(@.publisher.*.city, "Spring.+")]'); + + $this->assertCount(1, $result); + $this->assertSame('Sword of Honour', $result[0]['title']); + } + + public function testUseAtSymbolReturnsAll() + { + $result = self::getBookstoreCrawler()->find('$.store.bicycle[?(@ == @)]'); + + $this->assertSame([ + 'red', + 399, + ], $result); + } + + public function testUseAtSymbolAloneReturnsAll() + { + $result = self::getBookstoreCrawler()->find('$.store.bicycle[?(@)]'); + + $this->assertSame([ + 'red', + 399, + ], $result); + } + public function testValueFunctionWithOuterParentheses() { $result = self::getBookstoreCrawler()->find('$.store.book[?(value(@.price) == 8.95)]'); @@ -404,6 +534,264 @@ public function testAcceptsJsonPath() $this->assertSame('red', $result[0]['color']); } + public function testStarAsKey() + { + $crawler = new JsonCrawler(<<find('$["*"]'); + + $this->assertCount(1, $result); + $this->assertSame(['a' => 1, 'b' => 2], $result[0]); + } + + /** + * @dataProvider provideUnicodeEscapeSequencesProvider + */ + public function testUnicodeEscapeSequences(string $jsonPath, array $expected) + { + $this->assertSame($expected, self::getUnicodeDocumentCrawler()->find($jsonPath)); + } + + public static function provideUnicodeEscapeSequencesProvider(): array + { + return [ + [ + '$["caf\u00e9"]', + ['coffee'], + ], + [ + '$["\u65e5\u672c"]', + ['Japan'], + ], + [ + '$["M\u00fcller"]', + [], + ], + [ + '$["emoji\ud83d\ude00"]', + ['smiley'], + ], + [ + '$["tab\there"]', + ['with tab'], + ], + [ + '$["new\nline"]', + ['with newline'], + ], + [ + '$["quote\"here"]', + ['with quote'], + ], + [ + '$["backslash\\\\here"]', + ['with backslash'], + ], + [ + '$["apostrophe\'here"]', + ['with apostrophe'], + ], + [ + '$["control\u0001char"]', + ['with control char'], + ], + [ + '$["\u0063af\u00e9"]', + ['coffee'], + ], + ]; + } + + /** + * @dataProvider provideSingleQuotedStringProvider + */ + public function testSingleQuotedStrings(string $jsonPath, array $expected) + { + $this->assertSame($expected, self::getUnicodeDocumentCrawler()->find($jsonPath)); + } + + public static function provideSingleQuotedStringProvider(): array + { + return [ + [ + "$['caf\\u00e9']", + ['coffee'], + ], + [ + "$['\\u65e5\\u672c']", + ['Japan'], + ], + [ + "$['quote\"here']", + ['with quote'], + ], + [ + "$['M\\u00fcller']", + [], + ], + [ + "$['emoji\\ud83d\\ude00']", + ['smiley'], + ], + [ + "$['tab\\there']", + ['with tab'], + ], + [ + "$['quote\\\"here']", + ['with quote'], + ], + [ + "$['backslash\\\\here']", + ['with backslash'], + ], + [ + "$['apostrophe\\'here']", + ['with apostrophe'], + ], + [ + "$['control\\u0001char']", + ['with control char'], + ], + [ + "$['\\u0063af\\u00e9']", + ['coffee'], + ], + ]; + } + + /** + * @dataProvider provideFilterWithUnicodeProvider + */ + public function testFilterWithUnicodeStrings(string $jsonPath, int $expectedCount, string $expectedCountry) + { + $result = self::getUnicodeDocumentCrawler()->find($jsonPath); + + $this->assertCount($expectedCount, $result); + + if ($expectedCount > 0) { + $this->assertSame($expectedCountry, $result[0]['country']); + } + } + + public static function provideFilterWithUnicodeProvider(): array + { + return [ + [ + '$.users[?(@.name == "caf\u00e9")]', + 1, + 'France', + ], + [ + '$.users[?(@.name == "\u65e5\u672c\u592a\u90ce")]', + 1, + 'Japan', + ], + [ + '$.users[?(@.name == "Jos\u00e9")]', + 1, + 'Spain', + ], + [ + '$.users[?(@.name == "John")]', + 1, + 'USA', + ], + [ + '$.users[?(@.name == "NonExistent\u0020Name")]', + 0, + '', + ], + ]; + } + + /** + * @dataProvider provideInvalidUnicodeSequenceProvider + */ + public function testInvalidUnicodeSequencesAreProcessedAsLiterals(string $jsonPath) + { + $this->assertIsArray(self::getUnicodeDocumentCrawler()->find($jsonPath), 'invalid unicode sequence should be treated as literal and not throw'); + } + + public static function provideInvalidUnicodeSequenceProvider(): array + { + return [ + [ + '$["test\uZZZZ"]', + ], + [ + '$["test\u123"]', + ], + [ + '$["test\u"]', + ], + ]; + } + + /** + * @dataProvider provideComplexUnicodePath + */ + public function testComplexUnicodePaths(string $jsonPath, array $expected) + { + $complexJson = [ + 'データ' => [ + 'ユーザー' => [ + ['名前' => 'テスト', 'ID' => 1], + ['名前' => 'サンプル', 'ID' => 2], + ], + ], + 'special🔑' => [ + 'value💎' => 'treasure', + ], + ]; + + $crawler = new JsonCrawler(json_encode($complexJson)); + + $this->assertSame($expected, $crawler->find($jsonPath)); + } + + public static function provideComplexUnicodePath(): array + { + return [ + [ + '$["\u30c7\u30fc\u30bf"]["\u30e6\u30fc\u30b6\u30fc"][0]["\u540d\u524d"]', + ['テスト'], + ], + [ + '$["special\ud83d\udd11"]["value\ud83d\udc8e"]', + ['treasure'], + ], + [ + '$["\u30c7\u30fc\u30bf"]["\u30e6\u30fc\u30b6\u30fc"][*]["\u540d\u524d"]', + ['テスト', 'サンプル'], + ], + ]; + } + + public function testSurrogatePairHandling() + { + $json = ['𝒽𝑒𝓁𝓁𝑜' => 'mathematical script hello']; + $crawler = new JsonCrawler(json_encode($json)); + + // mathematical script "hello" requires surrogate pairs for each character + $result = $crawler->find('$["\ud835\udcbd\ud835\udc52\ud835\udcc1\ud835\udcc1\ud835\udc5c"]'); + $this->assertSame(['mathematical script hello'], $result); + } + + public function testMixedQuoteTypes() + { + $json = ['key"with"quotes' => 'value1', "key'with'apostrophes" => 'value2']; + $crawler = new JsonCrawler(json_encode($json)); + + $result = $crawler->find('$[\'key"with"quotes\']'); + $this->assertSame(['value1'], $result); + + $result = $crawler->find('$["key\'with\'apostrophes"]'); + $this->assertSame(['value2'], $result); + } + private static function getBookstoreCrawler(): JsonCrawler { return new JsonCrawler(<< 'coffee', + '日本' => 'Japan', + 'emoji😀' => 'smiley', + 'tab here' => 'with tab', + "new\nline" => 'with newline', + 'quote"here' => 'with quote', + 'backslash\\here' => 'with backslash', + 'apostrophe\'here' => 'with apostrophe', + "control\x01char" => 'with control char', + 'users' => [ + ['name' => 'café', 'country' => 'France'], + ['name' => '日本太郎', 'country' => 'Japan'], + ['name' => 'John', 'country' => 'USA'], + ['name' => 'Müller', 'country' => 'Germany'], + ['name' => 'José', 'country' => 'Spain'], + ], + ]; + + return new JsonCrawler(json_encode($json)); + } } diff --git a/src/Symfony/Component/JsonPath/Tests/JsonPathComplianceTestSuiteTest.php b/src/Symfony/Component/JsonPath/Tests/JsonPathComplianceTestSuiteTest.php new file mode 100644 index 0000000000000..851a45e275e7c --- /dev/null +++ b/src/Symfony/Component/JsonPath/Tests/JsonPathComplianceTestSuiteTest.php @@ -0,0 +1,557 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\JsonPath\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\JsonPath\Exception\JsonCrawlerException; +use Symfony\Component\JsonPath\JsonCrawler; + +final class JsonPathComplianceTestSuiteTest extends TestCase +{ + private const UNSUPPORTED_TEST_CASES = [ + 'basic, multiple selectors, name and index, array data', + 'basic, multiple selectors, name and index, object data', + 'basic, multiple selectors, index and slice', + 'basic, multiple selectors, index and slice, overlapping', + 'basic, multiple selectors, wildcard and index', + 'basic, multiple selectors, wildcard and name', + 'basic, multiple selectors, wildcard and slice', + 'basic, multiple selectors, multiple wildcards', + 'basic, selector, leading comma', + 'basic, selector, trailing comma', + 'filter, existence, without segments', + 'filter, existence', + 'filter, existence, present with null', + 'filter, absolute existence, without segments', + 'filter, absolute existence, with segments', + 'filter, equals string, single quotes', + 'filter, equals numeric string, single quotes', + 'filter, equals string, double quotes', + 'filter, equals numeric string, double quotes', + 'filter, equals number', + 'filter, equals null', + 'filter, equals null, absent from data', + 'filter, equals true', + 'filter, equals false', + 'filter, equals self', + 'filter, absolute, equals self', + 'filter, equals, absent from index selector equals absent from name selector', + 'filter, deep equality, arrays', + 'filter, deep equality, objects', + 'filter, not-equals string, single quotes', + 'filter, not-equals numeric string, single quotes', + 'filter, not-equals string, single quotes, different type', + 'filter, not-equals string, double quotes', + 'filter, not-equals numeric string, double quotes', + 'filter, not-equals string, double quotes, different types', + 'filter, not-equals number', + 'filter, not-equals number, different types', + 'filter, not-equals null', + 'filter, not-equals null, absent from data', + 'filter, not-equals true', + 'filter, not-equals false', + 'filter, less than string, single quotes', + 'filter, less than string, double quotes', + 'filter, less than number', + 'filter, less than null', + 'filter, less than true', + 'filter, less than false', + 'filter, less than or equal to string, single quotes', + 'filter, less than or equal to string, double quotes', + 'filter, less than or equal to number', + 'filter, less than or equal to null', + 'filter, less than or equal to true', + 'filter, less than or equal to false', + 'filter, greater than string, single quotes', + 'filter, greater than string, double quotes', + 'filter, greater than number', + 'filter, greater than null', + 'filter, greater than true', + 'filter, greater than false', + 'filter, greater than or equal to string, single quotes', + 'filter, greater than or equal to string, double quotes', + 'filter, greater than or equal to number', + 'filter, greater than or equal to null', + 'filter, greater than or equal to true', + 'filter, greater than or equal to false', + 'filter, exists and not-equals null, absent from data', + 'filter, exists and exists, data false', + 'filter, exists or exists, data false', + 'filter, and', + 'filter, or', + 'filter, not expression', + 'filter, not exists', + 'filter, not exists, data null', + 'filter, non-singular existence, wildcard', + 'filter, non-singular existence, multiple', + 'filter, non-singular existence, slice', + 'filter, non-singular existence, negated', + 'filter, nested', + 'filter, name segment on primitive, selects nothing', + 'filter, name segment on array, selects nothing', + 'filter, index segment on object, selects nothing', + 'filter, followed by name selector', + 'filter, followed by child segment that selects multiple elements', + 'filter, multiple selectors', + 'filter, multiple selectors, comparison', + 'filter, multiple selectors, overlapping', + 'filter, multiple selectors, filter and index', + 'filter, multiple selectors, filter and wildcard', + 'filter, multiple selectors, filter and slice', + 'filter, multiple selectors, comparison filter, index and slice', + 'filter, equals number, zero and negative zero', + 'filter, equals number, negative zero and zero', + 'filter, equals number, with and without decimal fraction', + 'filter, equals number, exponent', + 'filter, equals number, exponent upper e', + 'filter, equals number, positive exponent', + 'filter, equals number, negative exponent', + 'filter, equals number, exponent 0', + 'filter, equals number, exponent -0', + 'filter, equals number, exponent +0', + 'filter, equals number, exponent leading -0', + 'filter, equals number, exponent +00', + 'filter, equals number, decimal fraction', + 'filter, equals number, decimal fraction, trailing 0', + 'filter, equals number, decimal fraction, exponent', + 'filter, equals number, decimal fraction, positive exponent', + 'filter, equals number, decimal fraction, negative exponent', + 'filter, equals, empty node list and empty node list', + 'filter, equals, empty node list and special nothing', + 'filter, object data', + 'filter, and binds more tightly than or', + 'filter, left to right evaluation', + 'filter, group terms, right', + 'filter, string literal, single quote in double quotes', + 'filter, string literal, double quote in single quotes', + 'filter, string literal, escaped single quote in single quotes', + 'filter, string literal, escaped double quote in double quotes', + 'functions, value, multi-value nodelist', + 'name selector, double quotes, escaped reverse solidus', + 'name selector, single quotes, escaped reverse solidus', + 'slice selector, slice selector with everything omitted, long form', + 'slice selector, start, min exact', + 'slice selector, start, max exact', + 'slice selector, end, min exact', + 'slice selector, end, max exact', + 'functions, length, arg is special nothing', + 'functions, match, don\'t select match', + 'functions, match, select non-match', + 'functions, match, arg is a function expression', + 'functions, search, don\'t select match', + 'functions, search, select non-match', + 'functions, search, arg is a function expression', + 'whitespace, filter, space between question mark and expression', + 'whitespace, filter, newline between question mark and expression', + 'whitespace, filter, tab between question mark and expression', + 'whitespace, filter, return between question mark and expression', + 'whitespace, filter, space between question mark and parenthesized expression', + 'whitespace, filter, newline between question mark and parenthesized expression', + 'whitespace, filter, tab between question mark and parenthesized expression', + 'whitespace, filter, return between question mark and parenthesized expression', + 'whitespace, filter, space between bracket and question mark', + 'whitespace, filter, newline between bracket and question mark', + 'whitespace, filter, tab between bracket and question mark', + 'whitespace, filter, return between bracket and question mark', + 'whitespace, functions, newline between parenthesis and arg', + 'whitespace, functions, newline between arg and comma', + 'whitespace, functions, newline between comma and arg', + 'whitespace, functions, newline between arg and parenthesis', + 'whitespace, functions, newlines in a relative singular selector', + 'whitespace, functions, newlines in an absolute singular selector', + 'whitespace, operators, space before ||', + 'whitespace, operators, newline before ||', + 'whitespace, operators, tab before ||', + 'whitespace, operators, return before ||', + 'whitespace, operators, space after ||', + 'whitespace, operators, newline after ||', + 'whitespace, operators, tab after ||', + 'whitespace, operators, return after ||', + 'whitespace, operators, space before &&', + 'whitespace, operators, newline before &&', + 'whitespace, operators, tab before &&', + 'whitespace, operators, return before &&', + 'whitespace, operators, space after &&', + 'whitespace, operators, newline after &&', + 'whitespace, operators, tab after &&', + 'whitespace, operators, return after &&', + 'whitespace, operators, space before ==', + 'whitespace, operators, newline before ==', + 'whitespace, operators, tab before ==', + 'whitespace, operators, return before ==', + 'whitespace, operators, space after ==', + 'whitespace, operators, newline after ==', + 'whitespace, operators, tab after ==', + 'whitespace, operators, return after ==', + 'whitespace, operators, space before !=', + 'whitespace, operators, newline before !=', + 'whitespace, operators, tab before !=', + 'whitespace, operators, return before !=', + 'whitespace, operators, space after !=', + 'whitespace, operators, newline after !=', + 'whitespace, operators, tab after !=', + 'whitespace, operators, return after !=', + 'whitespace, operators, space before <', + 'whitespace, operators, newline before <', + 'whitespace, operators, tab before <', + 'whitespace, operators, return before <', + 'whitespace, operators, space after <', + 'whitespace, operators, newline after <', + 'whitespace, operators, tab after <', + 'whitespace, operators, return after <', + 'whitespace, operators, space before >', + 'whitespace, operators, newline before >', + 'whitespace, operators, tab before >', + 'whitespace, operators, return before >', + 'whitespace, operators, space after >', + 'whitespace, operators, newline after >', + 'whitespace, operators, tab after >', + 'whitespace, operators, return after >', + 'whitespace, operators, space before <=', + 'whitespace, operators, newline before <=', + 'whitespace, operators, tab before <=', + 'whitespace, operators, return before <=', + 'whitespace, operators, space after <=', + 'whitespace, operators, newline after <=', + 'whitespace, operators, tab after <=', + 'whitespace, operators, return after <=', + 'whitespace, operators, space before >=', + 'whitespace, operators, newline before >=', + 'whitespace, operators, tab before >=', + 'whitespace, operators, return before >=', + 'whitespace, operators, space after >=', + 'whitespace, operators, newline after >=', + 'whitespace, operators, tab after >=', + 'whitespace, operators, return after >=', + 'whitespace, operators, space between logical not and test expression', + 'whitespace, operators, newline between logical not and test expression', + 'whitespace, operators, tab between logical not and test expression', + 'whitespace, operators, return between logical not and test expression', + 'whitespace, operators, space between logical not and parenthesized expression', + 'whitespace, operators, newline between logical not and parenthesized expression', + 'whitespace, operators, tab between logical not and parenthesized expression', + 'whitespace, operators, return between logical not and parenthesized expression', + 'whitespace, selectors, space between bracket and selector', + 'whitespace, selectors, newline between bracket and selector', + 'whitespace, selectors, tab between bracket and selector', + 'whitespace, selectors, return between bracket and selector', + 'whitespace, selectors, space between selector and bracket', + 'whitespace, selectors, tab between selector and bracket', + 'whitespace, selectors, return between selector and bracket', + 'whitespace, selectors, newline between selector and comma', + 'whitespace, selectors, newline between comma and selector', + 'whitespace, slice, space between start and colon', + 'whitespace, slice, newline between start and colon', + 'whitespace, slice, tab between start and colon', + 'whitespace, slice, return between start and colon', + 'whitespace, slice, space between colon and end', + 'whitespace, slice, newline between colon and end', + 'whitespace, slice, tab between colon and end', + 'whitespace, slice, return between colon and end', + 'whitespace, slice, space between end and colon', + 'whitespace, slice, newline between end and colon', + 'whitespace, slice, tab between end and colon', + 'whitespace, slice, return between end and colon', + 'whitespace, slice, space between colon and step', + 'whitespace, slice, newline between colon and step', + 'whitespace, slice, tab between colon and step', + 'whitespace, slice, return between colon and step', + 'basic, descendant segment, multiple selectors', + 'basic, descendant segment, object traversal, multiple selectors', + 'basic, bald descendant segment', + 'filter, relative non-singular query, index, equal', + 'filter, relative non-singular query, index, not equal', + 'filter, relative non-singular query, index, less-or-equal', + 'filter, relative non-singular query, name, equal', + 'filter, relative non-singular query, name, not equal', + 'filter, relative non-singular query, name, less-or-equal', + 'filter, relative non-singular query, combined, equal', + 'filter, relative non-singular query, combined, not equal', + 'filter, relative non-singular query, combined, less-or-equal', + 'filter, relative non-singular query, wildcard, equal', + 'filter, relative non-singular query, wildcard, not equal', + 'filter, relative non-singular query, wildcard, less-or-equal', + 'filter, relative non-singular query, slice, equal', + 'filter, relative non-singular query, slice, not equal', + 'filter, relative non-singular query, slice, less-or-equal', + 'filter, absolute non-singular query, index, equal', + 'filter, absolute non-singular query, index, not equal', + 'filter, absolute non-singular query, index, less-or-equal', + 'filter, absolute non-singular query, name, equal', + 'filter, absolute non-singular query, name, not equal', + 'filter, absolute non-singular query, name, less-or-equal', + 'filter, absolute non-singular query, combined, equal', + 'filter, absolute non-singular query, combined, not equal', + 'filter, absolute non-singular query, combined, less-or-equal', + 'filter, absolute non-singular query, wildcard, equal', + 'filter, absolute non-singular query, wildcard, not equal', + 'filter, absolute non-singular query, wildcard, less-or-equal', + 'filter, absolute non-singular query, slice, equal', + 'filter, absolute non-singular query, slice, not equal', + 'filter, absolute non-singular query, slice, less-or-equal', + 'filter, equals, special nothing', + 'filter, group terms, left', + 'index selector, min exact index - 1', + 'index selector, max exact index + 1', + 'index selector, overflowing index', + 'index selector, leading 0', + 'index selector, -0', + 'index selector, leading -0', + 'name selector, double quotes, embedded U+0000', + 'name selector, double quotes, embedded U+0001', + 'name selector, double quotes, embedded U+0002', + 'name selector, double quotes, embedded U+0003', + 'name selector, double quotes, embedded U+0004', + 'name selector, double quotes, embedded U+0005', + 'name selector, double quotes, embedded U+0006', + 'name selector, double quotes, embedded U+0007', + 'name selector, double quotes, embedded U+0008', + 'name selector, double quotes, embedded U+0009', + 'name selector, double quotes, embedded U+000B', + 'name selector, double quotes, embedded U+000C', + 'name selector, double quotes, embedded U+000D', + 'name selector, double quotes, embedded U+000E', + 'name selector, double quotes, embedded U+000F', + 'name selector, double quotes, embedded U+0010', + 'name selector, double quotes, embedded U+0011', + 'name selector, double quotes, embedded U+0012', + 'name selector, double quotes, embedded U+0013', + 'name selector, double quotes, embedded U+0014', + 'name selector, double quotes, embedded U+0015', + 'name selector, double quotes, embedded U+0016', + 'name selector, double quotes, embedded U+0017', + 'name selector, double quotes, embedded U+0018', + 'name selector, double quotes, embedded U+0019', + 'name selector, double quotes, embedded U+001A', + 'name selector, double quotes, embedded U+001B', + 'name selector, double quotes, embedded U+001C', + 'name selector, double quotes, embedded U+001D', + 'name selector, double quotes, embedded U+001E', + 'name selector, double quotes, embedded U+001F', + 'name selector, double quotes, escaped backspace', + 'name selector, double quotes, escaped form feed', + 'name selector, double quotes, escaped line feed', + 'name selector, double quotes, escaped carriage return', + 'name selector, double quotes, escaped tab', + 'name selector, double quotes, escaped ☺, upper case hex', + 'name selector, double quotes, escaped ☺, lower case hex', + 'name selector, double quotes, surrogate pair 𝄞', + 'name selector, double quotes, surrogate pair 😀', + 'name selector, double quotes, before high surrogates', + 'name selector, double quotes, after low surrogates', + 'name selector, double quotes, invalid escaped single quote', + 'name selector, double quotes, question mark escape', + 'name selector, double quotes, bell escape', + 'name selector, double quotes, vertical tab escape', + 'name selector, double quotes, 0 escape', + 'name selector, double quotes, x escape', + 'name selector, double quotes, n escape', + 'name selector, double quotes, unicode escape no hex', + 'name selector, double quotes, unicode escape too few hex', + 'name selector, double quotes, unicode escape upper u', + 'name selector, double quotes, unicode escape upper u long', + 'name selector, double quotes, unicode escape plus', + 'name selector, double quotes, unicode escape brackets', + 'name selector, double quotes, unicode escape brackets long', + 'name selector, double quotes, single high surrogate', + 'name selector, double quotes, single low surrogate', + 'name selector, double quotes, high high surrogate', + 'name selector, double quotes, low low surrogate', + 'name selector, double quotes, surrogate non-surrogate', + 'name selector, double quotes, non-surrogate surrogate', + 'name selector, double quotes, surrogate supplementary', + 'name selector, double quotes, supplementary surrogate', + 'name selector, double quotes, surrogate incomplete low', + 'name selector, single quotes, embedded U+0000', + 'name selector, single quotes, embedded U+0001', + 'name selector, single quotes, embedded U+0002', + 'name selector, single quotes, embedded U+0003', + 'name selector, single quotes, embedded U+0004', + 'name selector, single quotes, embedded U+0005', + 'name selector, single quotes, embedded U+0006', + 'name selector, single quotes, embedded U+0007', + 'name selector, single quotes, embedded U+0008', + 'name selector, single quotes, embedded U+0009', + 'name selector, single quotes, embedded U+000B', + 'name selector, single quotes, embedded U+000C', + 'name selector, single quotes, embedded U+000D', + 'name selector, single quotes, embedded U+000E', + 'name selector, single quotes, embedded U+000F', + 'name selector, single quotes, embedded U+0010', + 'name selector, single quotes, embedded U+0011', + 'name selector, single quotes, embedded U+0012', + 'name selector, single quotes, embedded U+0013', + 'name selector, single quotes, embedded U+0014', + 'name selector, single quotes, embedded U+0015', + 'name selector, single quotes, embedded U+0016', + 'name selector, single quotes, embedded U+0017', + 'name selector, single quotes, embedded U+0018', + 'name selector, single quotes, embedded U+0019', + 'name selector, single quotes, embedded U+001A', + 'name selector, single quotes, embedded U+001B', + 'name selector, single quotes, embedded U+001C', + 'name selector, single quotes, embedded U+001D', + 'name selector, single quotes, embedded U+001E', + 'name selector, single quotes, embedded U+001F', + 'name selector, single quotes, escaped backspace', + 'name selector, single quotes, escaped form feed', + 'name selector, single quotes, escaped line feed', + 'name selector, single quotes, escaped carriage return', + 'name selector, single quotes, escaped tab', + 'name selector, single quotes, escaped ☺, upper case hex', + 'name selector, single quotes, escaped ☺, lower case hex', + 'name selector, single quotes, surrogate pair 𝄞', + 'name selector, single quotes, surrogate pair 😀', + 'name selector, single quotes, invalid escaped double quote', + 'slice selector, excessively large from value with negative step', + 'slice selector, step, min exact - 1', + 'slice selector, step, max exact + 1', + 'slice selector, overflowing to value', + 'slice selector, underflowing from value', + 'slice selector, overflowing from value with negative step', + 'slice selector, underflowing to value with negative step', + 'slice selector, overflowing step', + 'slice selector, underflowing step', + 'slice selector, step, leading 0', + 'slice selector, step, -0', + 'slice selector, step, leading -0', + 'functions, count, count function', + 'functions, count, single-node arg', + 'functions, count, multiple-selector arg', + 'functions, count, non-query arg, number', + 'functions, count, non-query arg, string', + 'functions, count, non-query arg, true', + 'functions, count, non-query arg, false', + 'functions, count, non-query arg, null', + 'functions, count, result must be compared', + 'functions, count, no params', + 'functions, count, too many params', + 'functions, length, string data, unicode', + 'functions, length, result must be compared', + 'functions, length, no params', + 'functions, length, too many params', + 'functions, length, non-singular query arg', + 'functions, length, arg is a function expression', + 'functions, match, regex from the document', + 'functions, match, filter, match function, unicode char class, uppercase', + 'functions, match, filter, match function, unicode char class negated, uppercase', + 'functions, match, filter, match function, unicode, surrogate pair', + 'functions, match, dot matcher on \u2028', + 'functions, match, dot matcher on \u2029', + 'functions, match, result cannot be compared', + 'functions, match, too few params', + 'functions, match, too many params', + 'functions, match, dot in character class', + 'functions, match, escaped dot', + 'functions, match, escaped backslash before dot', + 'functions, match, escaped left square bracket', + 'functions, match, escaped right square bracket', + 'functions, match, explicit caret', + 'functions, match, explicit dollar', + 'functions, search, regex from the document', + 'functions, search, filter, search function, unicode char class, uppercase', + 'functions, search, filter, search function, unicode char class negated, uppercase', + 'functions, search, filter, search function, unicode, surrogate pair', + 'functions, search, dot matcher on \u2028', + 'functions, search, dot matcher on \u2029', + 'functions, search, result cannot be compared', + 'functions, search, too few params', + 'functions, search, too many params', + 'functions, search, dot in character class', + 'functions, search, escaped dot', + 'functions, search, escaped backslash before dot', + 'functions, search, escaped left square bracket', + 'functions, search, escaped right square bracket', + 'functions, value, single-value nodelist', + 'functions, value, too few params', + 'functions, value, too many params', + 'functions, value, result must be compared', + 'whitespace, filter, space between parenthesized expression and bracket', + 'whitespace, filter, tab between parenthesized expression and bracket', + 'whitespace, filter, return between parenthesized expression and bracket', + 'whitespace, functions, space between function name and parenthesis', + 'whitespace, functions, tab between function name and parenthesis', + 'whitespace, functions, return between function name and parenthesis', + 'whitespace, functions, space between parenthesis and arg', + 'whitespace, functions, tab between parenthesis and arg', + 'whitespace, functions, return between parenthesis and arg', + 'whitespace, functions, space between arg and comma', + 'whitespace, functions, tab between arg and comma', + 'whitespace, functions, return between arg and comma', + 'whitespace, functions, space between comma and arg', + 'whitespace, functions, tab between comma and arg', + 'whitespace, functions, return between comma and arg', + 'whitespace, functions, space between arg and parenthesis', + 'whitespace, functions, tab between arg and parenthesis', + 'whitespace, functions, return between arg and parenthesis', + 'whitespace, functions, spaces in a relative singular selector', + 'whitespace, functions, tabs in a relative singular selector', + 'whitespace, functions, returns in a relative singular selector', + 'whitespace, functions, spaces in an absolute singular selector', + 'whitespace, functions, tabs in an absolute singular selector', + 'whitespace, functions, returns in an absolute singular selector', + 'whitespace, selectors, space between root and bracket', + 'whitespace, selectors, newline between root and bracket', + 'whitespace, selectors, tab between root and bracket', + 'whitespace, selectors, return between root and bracket', + 'whitespace, selectors, space between bracket and bracket', + 'whitespace, selectors, newline between bracket and bracket', + 'whitespace, selectors, tab between bracket and bracket', + 'whitespace, selectors, return between bracket and bracket', + 'whitespace, selectors, space between root and dot', + 'whitespace, selectors, newline between root and dot', + 'whitespace, selectors, tab between root and dot', + 'whitespace, selectors, return between root and dot', + 'whitespace, selectors, space between selector and comma', + 'whitespace, selectors, tab between selector and comma', + 'whitespace, selectors, return between selector and comma', + 'whitespace, selectors, space between comma and selector', + 'whitespace, selectors, tab between comma and selector', + 'whitespace, selectors, return between comma and selector', + ]; + + /** + * @dataProvider complianceCaseProvider + */ + public function testComplianceTestCase(string $selector, array $document, array $expectedResults, bool $invalidSelector) + { + $jsonCrawler = new JsonCrawler(json_encode($document)); + + if ($invalidSelector) { + $this->expectException(JsonCrawlerException::class); + } + + $result = $jsonCrawler->find($selector); + + if (!$invalidSelector) { + $this->assertContains($result, $expectedResults); + } + } + + public static function complianceCaseProvider(): iterable + { + $data = json_decode(file_get_contents(__DIR__ . '/Fixtures/cts.json'), true, flags: JSON_THROW_ON_ERROR); + + foreach ($data['tests'] as $test) { + if (\in_array($test['name'], self::UNSUPPORTED_TEST_CASES, true)) { + continue; + } + + yield $test['name'] => [ + $test['selector'], + $test['document'] ?? [], + isset($test['result']) ? [$test['result']] : ($test['results'] ?? []), + $test['invalid_selector'] ?? false, + ]; + } + } +} diff --git a/src/Symfony/Component/JsonPath/Tests/JsonPathTest.php b/src/Symfony/Component/JsonPath/Tests/JsonPathTest.php index 66b27356c07e1..cbe6f20d17c0b 100644 --- a/src/Symfony/Component/JsonPath/Tests/JsonPathTest.php +++ b/src/Symfony/Component/JsonPath/Tests/JsonPathTest.php @@ -23,8 +23,8 @@ public function testBuildPath() ->index(0) ->key('address'); - $this->assertSame('$.users[0].address', (string) $path); - $this->assertSame('$.users[0].address..city', (string) $path->deepScan()->key('city')); + $this->assertSame('$["users"][0]["address"]', (string) $path); + $this->assertSame('$["users"][0]["address"]..["city"]', (string) $path->deepScan()->key('city')); } public function testBuildWithFilter() @@ -33,6 +33,74 @@ public function testBuildWithFilter() $path = $path->key('users') ->filter('@.age > 18'); - $this->assertSame('$.users[?(@.age > 18)]', (string) $path); + $this->assertSame('$["users"][?(@.age > 18)]', (string) $path); + } + + public function testAll() + { + $path = new JsonPath(); + $path = $path->key('users') + ->all(); + + $this->assertSame('$["users"][*]', (string) $path); + } + + public function testFirst() + { + $path = new JsonPath(); + $path = $path->key('users') + ->first(); + + $this->assertSame('$["users"][0]', (string) $path); + } + + public function testLast() + { + $path = new JsonPath(); + $path = $path->key('users') + ->last(); + + $this->assertSame('$["users"][-1]', (string) $path); + } + + /** + * @dataProvider provideKeysToEscape + */ + public function testEscapedKey(string $key, string $expectedPath) + { + $path = new JsonPath(); + $path = $path->key($key); + + $this->assertSame($expectedPath, (string) $path); + } + + public static function provideKeysToEscape(): iterable + { + yield ['simple_key', '$["simple_key"]']; + yield ['key"with"quotes', '$["key\\"with\\"quotes"]']; + yield ['path\\backslash', '$["path\\backslash"]']; + yield ['mixed\\"case', '$["mixed\\\\\\"case"]']; + yield ['unicode_🔑', '$["unicode_🔑"]']; + yield ['"quotes_only"', '$["\\"quotes_only\\""]']; + yield ['\\\\multiple\\\\backslashes', '$["\\\\\\\\multiple\\\\\\backslashes"]']; + yield ["control\x00\x1f\x1echar", '$["control\u0000\u001f\u001echar"]']; + + yield ['key"with\\"mixed', '$["key\\"with\\\\\\"mixed"]']; + yield ['\\"complex\\"case\\"', '$["\\\\\\"complex\\\\\\"case\\\\\\""]']; + yield ['json_like":{"value":"test"}', '$["json_like\\":{\\"value\\":\\"test\\"}"]']; + yield ['C:\\Program Files\\"App Name"', '$["C:\\\\Program Files\\\\\\"App Name\\""]']; + + yield ['key_with_é_accents', '$["key_with_é_accents"]']; + yield ['unicode_→_arrows', '$["unicode_→_arrows"]']; + yield ['chinese_中文_key', '$["chinese_中文_key"]']; + + yield ['', '$[""]']; + yield [' ', '$[" "]']; + yield [' spaces ', '$[" spaces "]']; + yield ["\t\n\r", '$["\\t\\n\\r"]']; + yield ["control\x00char", '$["control\u0000char"]']; + yield ["newline\nkey", '$["newline\\nkey"]']; + yield ["tab\tkey", '$["tab\\tkey"]']; + yield ["carriage\rreturn", '$["carriage\\rreturn"]']; } } diff --git a/src/Symfony/Component/JsonPath/Tests/Test/JsonPathAssertionsTraitTest.php b/src/Symfony/Component/JsonPath/Tests/Test/JsonPathAssertionsTraitTest.php new file mode 100644 index 0000000000000..1044e7658672b --- /dev/null +++ b/src/Symfony/Component/JsonPath/Tests/Test/JsonPathAssertionsTraitTest.php @@ -0,0 +1,200 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\JsonPath\Tests\Test; + +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\TestCase; +use Symfony\Component\JsonPath\Test\JsonPathAssertionsTrait; + +class JsonPathAssertionsTraitTest extends TestCase +{ + use JsonPathAssertionsTrait; + + public function testAssertJsonPathEqualsOk() + { + self::assertJsonPathEquals([1], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathEqualsOkWithTypeCoercion() + { + self::assertJsonPathEquals(['1'], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathEqualsKo() + { + $thrown = false; + try { + self::assertJsonPathEquals([2], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } catch (AssertionFailedError $exception) { + self::assertMatchesRegularExpression('/Failed asserting that .+ equals JSON path "\$\.a\[2]" result./s', $exception->getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + public function testAssertJsonPathNotEqualsOk() + { + self::assertJsonPathNotEquals([2], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathNotEqualsKo() + { + $thrown = false; + try { + self::assertJsonPathNotEquals([1], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } catch (AssertionFailedError $exception) { + self::assertMatchesRegularExpression('/Failed asserting that .+ does not equal JSON path "\$\.a\[2]" result./s', $exception->getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + public function testAssertJsonPathCountOk() + { + self::assertJsonPathCount(6, '$.a[*]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathCountOkWithFilter() + { + self::assertJsonPathCount(2, '$.book[?(@.price > 25)]', <<getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + public function testAssertJsonPathSameOk() + { + self::assertJsonPathSame([1], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathSameKo() + { + $thrown = false; + try { + self::assertJsonPathSame([2], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } catch (AssertionFailedError $exception) { + self::assertMatchesRegularExpression('/Failed asserting that .+ is identical to JSON path "\$\.a\[2]" result\./s', $exception->getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + public function testAssertJsonPathHasNoTypeCoercion() + { + $thrown = false; + try { + self::assertJsonPathSame(['1'], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } catch (AssertionFailedError $exception) { + self::assertMatchesRegularExpression('/Failed asserting that .+ is identical to JSON path "\$\.a\[2]" result\./s', $exception->getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + public function testAssertJsonPathNotSameOk() + { + self::assertJsonPathNotSame([2], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathNotSameKo() + { + $thrown = false; + try { + self::assertJsonPathNotSame([1], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } catch (AssertionFailedError $exception) { + self::assertMatchesRegularExpression('/Failed asserting that .+ is not identical to JSON path "\$\.a\[2]" result\./s', $exception->getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + public function testAssertJsonPathNotSameHasNoTypeCoercion() + { + self::assertJsonPathNotSame(['1'], '$.a[2]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathContainsOk() + { + self::assertJsonPathContains(1, '$.a[*]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathContainsKo() + { + $thrown = false; + try { + self::assertJsonPathContains(0, '$.a[*]', self::getSimpleCollectionCrawlerData()); + } catch (AssertionFailedError $exception) { + self::assertSame('Failed asserting that 0 is found in elements at JSON path "$.a[*]".', $exception->getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + public function testAssertJsonPathNotContainsOk() + { + self::assertJsonPathNotContains(0, '$.a[*]', self::getSimpleCollectionCrawlerData()); + } + + public function testAssertJsonPathNotContainsKo() + { + $thrown = false; + try { + self::assertJsonPathNotContains(1, '$.a[*]', self::getSimpleCollectionCrawlerData()); + } catch (AssertionFailedError $exception) { + self::assertSame('Failed asserting that 1 is not found in elements at JSON path "$.a[*]".', $exception->getMessage()); + + $thrown = true; + } + + self::assertTrue($thrown); + } + + private static function getSimpleCollectionCrawlerData(): string + { + return << [ @@ -77,7 +77,7 @@ public function testBracketNotation(string $path, array $expectedTokens) } } - public function bracketNotationProvider(): array + public static function bracketNotationProvider(): array { return [ 'bracket with quotes' => [ @@ -117,7 +117,7 @@ public function testFilterExpressions(string $path, array $expectedTokens) } } - public function filterExpressionProvider(): array + public static function filterExpressionProvider(): array { return [ 'simple filter' => [ @@ -162,7 +162,7 @@ public function testComplexPaths(string $path, array $expectedTokens) } } - public function complexPathProvider(): array + public static function complexPathProvider(): array { return [ 'mixed with recursive' => [ diff --git a/src/Symfony/Component/JsonPath/composer.json b/src/Symfony/Component/JsonPath/composer.json index 95b02675e7459..feb8158aa5be2 100644 --- a/src/Symfony/Component/JsonPath/composer.json +++ b/src/Symfony/Component/JsonPath/composer.json @@ -17,10 +17,14 @@ ], "require": { "php": ">=8.2", + "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/json-streamer": "^7.3" + "symfony/json-streamer": "7.3.*" + }, + "conflict": { + "symfony/json-streamer": ">=7.4" }, "autoload": { "psr-4": { "Symfony\\Component\\JsonPath\\": "" }, diff --git a/src/Symfony/Component/JsonStreamer/JsonStreamReader.php b/src/Symfony/Component/JsonStreamer/JsonStreamReader.php index b2f2fabaa3dad..e813f4a8a5408 100644 --- a/src/Symfony/Component/JsonStreamer/JsonStreamReader.php +++ b/src/Symfony/Component/JsonStreamer/JsonStreamReader.php @@ -45,7 +45,7 @@ public function __construct( private ContainerInterface $valueTransformers, PropertyMetadataLoaderInterface $propertyMetadataLoader, string $streamReadersDir, - string $lazyGhostsDir, + ?string $lazyGhostsDir = null, ) { $this->streamReaderGenerator = new StreamReaderGenerator($propertyMetadataLoader, $streamReadersDir); $this->instantiator = new Instantiator(); diff --git a/src/Symfony/Component/JsonStreamer/Mapping/GenericTypePropertyMetadataLoader.php b/src/Symfony/Component/JsonStreamer/Mapping/GenericTypePropertyMetadataLoader.php index ccc705e7c8e33..a89394283dd52 100644 --- a/src/Symfony/Component/JsonStreamer/Mapping/GenericTypePropertyMetadataLoader.php +++ b/src/Symfony/Component/JsonStreamer/Mapping/GenericTypePropertyMetadataLoader.php @@ -43,10 +43,7 @@ public function load(string $className, array $options = [], array $context = [] foreach ($result as &$metadata) { $type = $metadata->getType(); - - if (isset($variableTypes[(string) $type])) { - $metadata = $metadata->withType($this->replaceVariableTypes($type, $variableTypes)); - } + $metadata = $metadata->withType($this->replaceVariableTypes($type, $variableTypes)); } return $result; @@ -122,11 +119,11 @@ private function replaceVariableTypes(Type $type, array $variableTypes): Type } if ($type instanceof UnionType) { - return new UnionType(...array_map(fn (Type $t): Type => $this->replaceVariableTypes($t, $variableTypes), $type->getTypes())); + return Type::union(...array_map(fn (Type $t): Type => $this->replaceVariableTypes($t, $variableTypes), $type->getTypes())); } if ($type instanceof IntersectionType) { - return new IntersectionType(...array_map(fn (Type $t): Type => $this->replaceVariableTypes($t, $variableTypes), $type->getTypes())); + return Type::intersection(...array_map(fn (Type $t): Type => $this->replaceVariableTypes($t, $variableTypes), $type->getTypes())); } if ($type instanceof CollectionType) { @@ -134,7 +131,7 @@ private function replaceVariableTypes(Type $type, array $variableTypes): Type } if ($type instanceof GenericType) { - return new GenericType( + return Type::generic( $this->replaceVariableTypes($type->getWrappedType(), $variableTypes), ...array_map(fn (Type $t): Type => $this->replaceVariableTypes($t, $variableTypes), $type->getVariableTypes()), ); diff --git a/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php b/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php index 11ce2b4f93962..26bc022cae2e3 100644 --- a/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php +++ b/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php @@ -38,7 +38,7 @@ public function load(string $className, array $options = [], array $context = [] $type = $metadata->getType(); if ($type instanceof ObjectType && is_a($type->getClassName(), \DateTimeInterface::class, true)) { - if (\DateTime::class === $type->getClassName()) { + if (is_a($type->getClassName(), \DateTime::class, true)) { throw new InvalidArgumentException('The "DateTime" class is not supported. Use "DateTimeImmutable" instead.'); } diff --git a/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php b/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php index c363cb7b70284..18720297b16c6 100644 --- a/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php +++ b/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php @@ -34,6 +34,7 @@ use Symfony\Component\TypeInfo\Type\BuiltinType; use Symfony\Component\TypeInfo\Type\CollectionType; use Symfony\Component\TypeInfo\Type\EnumType; +use Symfony\Component\TypeInfo\Type\GenericType; use Symfony\Component\TypeInfo\Type\ObjectType; use Symfony\Component\TypeInfo\Type\UnionType; @@ -118,6 +119,10 @@ public function createDataModel(Type $type, array $options = [], array $context return new BackedEnumNode($type); } + if ($type instanceof GenericType) { + $type = $type->getWrappedType(); + } + if ($type instanceof ObjectType && !$type instanceof EnumType) { $typeString = (string) $type; $className = $type->getClassName(); diff --git a/src/Symfony/Component/JsonStreamer/Tests/Fixtures/Model/DummyWithGenerics.php b/src/Symfony/Component/JsonStreamer/Tests/Fixtures/Model/DummyWithGenerics.php index 18baf108aebe2..74c2dc212707b 100644 --- a/src/Symfony/Component/JsonStreamer/Tests/Fixtures/Model/DummyWithGenerics.php +++ b/src/Symfony/Component/JsonStreamer/Tests/Fixtures/Model/DummyWithGenerics.php @@ -8,7 +8,7 @@ class DummyWithGenerics { /** - * @var array + * @var list */ public array $dummies = []; } diff --git a/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php b/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php index f93dd8ba13ce4..6538a6d32383c 100644 --- a/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php +++ b/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php @@ -16,6 +16,7 @@ use Symfony\Component\JsonStreamer\Tests\Fixtures\Enum\DummyBackedEnum; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\ClassicDummy; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithDateTimes; +use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithGenerics; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNameAttributes; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNullableProperties; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithPhpDoc; @@ -100,6 +101,17 @@ public function testReadObject() }, '{"id": 10, "name": "dummy name"}', Type::object(ClassicDummy::class)); } + public function testReadObjectWithGenerics() + { + $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir); + + $this->assertRead($reader, function (mixed $read) { + $this->assertInstanceOf(DummyWithGenerics::class, $read); + $this->assertSame(10, $read->dummies[0]->id); + $this->assertSame('dummy name', $read->dummies[0]->name); + }, '{"dummies":[{"id":10,"name":"dummy name"}]}', Type::generic(Type::object(DummyWithGenerics::class), Type::object(ClassicDummy::class))); + } + public function testReadObjectWithStreamedName() { $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir); diff --git a/src/Symfony/Component/JsonStreamer/Tests/JsonStreamWriterTest.php b/src/Symfony/Component/JsonStreamer/Tests/JsonStreamWriterTest.php index 4fd987a6d4d11..14cc50881d0d1 100644 --- a/src/Symfony/Component/JsonStreamer/Tests/JsonStreamWriterTest.php +++ b/src/Symfony/Component/JsonStreamer/Tests/JsonStreamWriterTest.php @@ -17,6 +17,7 @@ use Symfony\Component\JsonStreamer\Tests\Fixtures\Enum\DummyBackedEnum; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\ClassicDummy; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithDateTimes; +use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithGenerics; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNameAttributes; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNullableProperties; use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithPhpDoc; @@ -117,6 +118,18 @@ public function testWriteObject() $this->assertWritten('{"id":10,"name":"dummy name"}', $dummy, Type::object(ClassicDummy::class)); } + public function testWriteObjectWithGenerics() + { + $nestedDummy = new DummyWithNameAttributes(); + $nestedDummy->id = 10; + $nestedDummy->name = 'dummy name'; + + $dummy = new DummyWithGenerics(); + $dummy->dummies = [$nestedDummy]; + + $this->assertWritten('{"dummies":[{"id":10,"name":"dummy name"}]}', $dummy, Type::generic(Type::object(DummyWithGenerics::class), Type::object(ClassicDummy::class))); + } + public function testWriteObjectWithStreamedName() { $dummy = new DummyWithNameAttributes(); diff --git a/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php b/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php index c71189815be29..779499adf21c2 100644 --- a/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php +++ b/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php @@ -47,6 +47,18 @@ public function testThrowWhenDateTimeType() $loader->load(self::class); } + public function testThrowWhenDateTimeSubclassType() + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('The "DateTime" class is not supported. Use "DateTimeImmutable" instead.'); + + $loader = new DateTimeTypePropertyMetadataLoader(self::propertyMetadataLoader([ + 'mutable' => new PropertyMetadata('mutable', Type::object(DateTimeChild::class)), + ])); + + $loader->load(self::class); + } + /** * @param array $propertiesMetadata */ @@ -64,3 +76,7 @@ public function load(string $className, array $options = [], array $context = [] }; } } + +class DateTimeChild extends \DateTime +{ +} diff --git a/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php b/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php index 41618e8e7f303..c437ca0d179f5 100644 --- a/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php +++ b/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php @@ -35,6 +35,7 @@ use Symfony\Component\TypeInfo\Type\BuiltinType; use Symfony\Component\TypeInfo\Type\CollectionType; use Symfony\Component\TypeInfo\Type\EnumType; +use Symfony\Component\TypeInfo\Type\GenericType; use Symfony\Component\TypeInfo\Type\ObjectType; use Symfony\Component\TypeInfo\Type\UnionType; @@ -124,6 +125,10 @@ private function createDataModel(Type $type, DataAccessorInterface $accessor, ar return new BackedEnumNode($accessor, $type); } + if ($type instanceof GenericType) { + $type = $type->getWrappedType(); + } + if ($type instanceof ObjectType && !$type instanceof EnumType) { $typeString = (string) $type; $className = $type->getClassName(); @@ -133,7 +138,7 @@ private function createDataModel(Type $type, DataAccessorInterface $accessor, ar } $context['generated_classes'][$typeString] = true; - $propertiesMetadata = $this->propertyMetadataLoader->load($className, $options, ['original_type' => $type] + $context); + $propertiesMetadata = $this->propertyMetadataLoader->load($className, $options, $context); try { $classReflection = new \ReflectionClass($className); diff --git a/src/Symfony/Component/Ldap/Security/LdapUser.php b/src/Symfony/Component/Ldap/Security/LdapUser.php index ef73b82422d0b..020fcb5441596 100644 --- a/src/Symfony/Component/Ldap/Security/LdapUser.php +++ b/src/Symfony/Component/Ldap/Security/LdapUser.php @@ -47,7 +47,7 @@ public function getRoles(): array public function getPassword(): ?string { - return $this->password; + return $this->password ?? null; } public function getSalt(): ?string @@ -89,7 +89,7 @@ public function isEqualTo(UserInterface $user): bool return false; } - if ($this->getPassword() !== $user->getPassword()) { + if (($this->getPassword() ?? $user->getPassword()) !== $user->getPassword()) { return false; } diff --git a/src/Symfony/Component/Ldap/Tests/Security/LdapUserTest.php b/src/Symfony/Component/Ldap/Tests/Security/LdapUserTest.php new file mode 100644 index 0000000000000..0a696bcd0c29d --- /dev/null +++ b/src/Symfony/Component/Ldap/Tests/Security/LdapUserTest.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\Ldap\Tests\Security; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Ldap\Entry; +use Symfony\Component\Ldap\Security\LdapUser; + +class LdapUserTest extends TestCase +{ + public function testIsEqualToWorksOnUnserializedUser() + { + $user = new LdapUser(new Entry('uid=jonhdoe,ou=MyBusiness,dc=symfony,dc=com', []), 'jonhdoe', 'p455w0rd'); + $unserializedUser = unserialize(serialize($user)); + + $this->assertTrue($unserializedUser->isEqualTo($user)); + } +} diff --git a/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php b/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php index f042620b71a6b..cf390a046040c 100644 --- a/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php +++ b/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php @@ -14,6 +14,7 @@ use Doctrine\DBAL\Configuration; use Doctrine\DBAL\Connection; use Doctrine\DBAL\DriverManager; +use Doctrine\DBAL\Exception; use Doctrine\DBAL\Exception as DBALException; use Doctrine\DBAL\Exception\TableNotFoundException; use Doctrine\DBAL\ParameterType; @@ -242,9 +243,16 @@ private function getCurrentTimestampStatement(): string { $platform = $this->conn->getDatabasePlatform(); + if (interface_exists(Exception::class)) { + // DBAL 4+ + $sqlitePlatformClass = 'Doctrine\DBAL\Platforms\SQLitePlatform'; + } else { + $sqlitePlatformClass = 'Doctrine\DBAL\Platforms\SqlitePlatform'; + } + return match (true) { $platform instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform => 'UNIX_TIMESTAMP()', - $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform => 'strftime(\'%s\',\'now\')', + $platform instanceof $sqlitePlatformClass => 'strftime(\'%s\',\'now\')', $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform => 'CAST(EXTRACT(epoch FROM NOW()) AS INT)', $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform => '(SYSDATE - TO_DATE(\'19700101\',\'yyyymmdd\'))*86400 - TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone), 1, 3))*3600', $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform => 'DATEDIFF(s, \'1970-01-01\', GETUTCDATE())', @@ -259,9 +267,16 @@ private function platformSupportsTableCreationInTransaction(): bool { $platform = $this->conn->getDatabasePlatform(); + if (interface_exists(Exception::class)) { + // DBAL 4+ + $sqlitePlatformClass = 'Doctrine\DBAL\Platforms\SQLitePlatform'; + } else { + $sqlitePlatformClass = 'Doctrine\DBAL\Platforms\SqlitePlatform'; + } + return match (true) { $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform, - $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform, + $platform instanceof $sqlitePlatformClass, $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform => true, default => false, }; diff --git a/src/Symfony/Component/Lock/Store/RedisStore.php b/src/Symfony/Component/Lock/Store/RedisStore.php index f41d4feccc1f9..e23856f79a5d8 100644 --- a/src/Symfony/Component/Lock/Store/RedisStore.php +++ b/src/Symfony/Component/Lock/Store/RedisStore.php @@ -265,7 +265,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 (null !== ($err = $this->redis->getLastError()) && str_starts_with($err, self::NO_SCRIPT_ERROR_MESSAGE_PREFIX)) { + if (null !== ($err = $client->getLastError()) && str_starts_with($err, self::NO_SCRIPT_ERROR_MESSAGE_PREFIX)) { $client->clearLastError(); $client->script('LOAD', $script); diff --git a/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php b/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php index c20d5341b0ed3..bb4ed1d89c04c 100644 --- a/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php +++ b/src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php @@ -14,6 +14,7 @@ use Doctrine\DBAL\Configuration; use Doctrine\DBAL\Connection; use Doctrine\DBAL\DriverManager; +use Doctrine\DBAL\Exception; use Doctrine\DBAL\Exception\TableNotFoundException; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory; @@ -176,7 +177,13 @@ public static function providePlatforms(): \Generator yield [\Doctrine\DBAL\Platforms\PostgreSQL94Platform::class]; } - yield [\Doctrine\DBAL\Platforms\SqlitePlatform::class]; + if (interface_exists(Exception::class)) { + // DBAL 4+ + yield [\Doctrine\DBAL\Platforms\SQLitePlatform::class]; + } else { + yield [\Doctrine\DBAL\Platforms\SqlitePlatform::class]; + } + yield [\Doctrine\DBAL\Platforms\SQLServerPlatform::class]; // DBAL < 4 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 734da0172f185..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; diff --git a/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php b/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php index 884e6e146bc38..9cd8463a28b78 100644 --- a/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php +++ b/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php @@ -88,7 +88,7 @@ public function readLine(): string 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/Bridge/Amqp/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/Connection.php index d5a6b666075f7..2599586f8f3d8 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/ConnectionTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php index c36270d81498e..9ebea2d115439 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php @@ -16,6 +16,7 @@ use Pheanstalk\Contract\PheanstalkSubscriberInterface; use Pheanstalk\Exception; use Pheanstalk\Exception\ClientException; +use Pheanstalk\Exception\ConnectionException; use Pheanstalk\Exception\DeadlineSoonException; use Pheanstalk\Exception\ServerException; use Pheanstalk\Pheanstalk; @@ -131,6 +132,7 @@ public function testItThrowsAnExceptionIfAnExtraOptionIsDefinedInDSN() public function testGet() { $id = '1234'; + $id2 = '1235'; $beanstalkdEnvelope = [ 'body' => 'foo', 'headers' => 'bar', @@ -140,13 +142,52 @@ public function testGet() $timeout = 44; $tubeList = new TubeList($tubeName = new TubeName($tube), $tubeNameDefault = new TubeName('default')); - $job = new Job(new JobId($id), json_encode($beanstalkdEnvelope)); $client = $this->createMock(PheanstalkInterface::class); $client->expects($this->once())->method('watch')->with($tubeName)->willReturn(2); $client->expects($this->once())->method('listTubesWatched')->willReturn($tubeList); $client->expects($this->once())->method('ignore')->with($tubeNameDefault)->willReturn(1); - $client->expects($this->once())->method('reserveWithTimeout')->with($timeout)->willReturn($job); + $client->expects($this->exactly(2))->method('reserveWithTimeout')->with($timeout)->willReturnOnConsecutiveCalls( + new Job(new JobId($id), json_encode($beanstalkdEnvelope)), + new Job(new JobId($id2), json_encode($beanstalkdEnvelope)), + ); + + $connection = new Connection(['tube_name' => $tube, 'timeout' => $timeout], $client); + + $envelope = $connection->get(); + + $this->assertSame($id, $envelope['id']); + $this->assertSame($beanstalkdEnvelope['body'], $envelope['body']); + $this->assertSame($beanstalkdEnvelope['headers'], $envelope['headers']); + + $envelope = $connection->get(); + + $this->assertSame($id2, $envelope['id']); + $this->assertSame($beanstalkdEnvelope['body'], $envelope['body']); + $this->assertSame($beanstalkdEnvelope['headers'], $envelope['headers']); + } + + public function testGetOnReconnect() + { + $id = '1234'; + $beanstalkdEnvelope = [ + 'body' => 'foo', + 'headers' => 'bar', + ]; + + $tube = 'baz'; + $timeout = 44; + + $tubeList = new TubeList($tubeName = new TubeName($tube), $tubeNameDefault = new TubeName('default')); + + $client = $this->createMock(PheanstalkInterface::class); + $client->expects($this->exactly(2))->method('watch')->with($tubeName)->willReturn(2); + $client->expects($this->exactly(2))->method('listTubesWatched')->willReturn($tubeList); + $client->expects($this->exactly(2))->method('ignore')->with($tubeNameDefault)->willReturn(1); + $client->expects($this->exactly(2))->method('reserveWithTimeout')->with($timeout)->willReturnOnConsecutiveCalls( + $this->throwException(new ConnectionException('123', 'foobar')), + new Job(new JobId($id), json_encode($beanstalkdEnvelope)), + ); $connection = new Connection(['tube_name' => $tube, 'timeout' => $timeout], $client); @@ -370,10 +411,11 @@ public function testSend() $expectedDelay = $delay / 1000; $id = '110'; + $id2 = '111'; $client = $this->createMock(PheanstalkInterface::class); $client->expects($this->once())->method('useTube')->with(new TubeName($tube)); - $client->expects($this->once())->method('put')->with( + $client->expects($this->exactly(2))->method('put')->with( $this->callback(function (string $data) use ($body, $headers): bool { $expectedMessage = json_encode([ 'body' => $body, @@ -385,7 +427,51 @@ public function testSend() 1024, $expectedDelay, 90 - )->willReturn(new Job(new JobId($id), 'foobar')); + )->willReturnOnConsecutiveCalls( + new Job(new JobId($id), 'foobar'), + new Job(new JobId($id2), 'foobar'), + ); + + $connection = new Connection(['tube_name' => $tube], $client); + + $returnedId = $connection->send($body, $headers, $delay); + + $this->assertSame($id, $returnedId); + + $returnedId = $connection->send($body, $headers, $delay); + + $this->assertSame($id2, $returnedId); + } + + public function testSendOnReconnect() + { + $tube = 'xyz'; + + $body = 'foo'; + $headers = ['test' => 'bar']; + $delay = 1000; + $expectedDelay = $delay / 1000; + + $id = '110'; + + $client = $this->createMock(PheanstalkInterface::class); + $client->expects($this->exactly(2))->method('useTube')->with(new TubeName($tube)); + $client->expects($this->exactly(2))->method('put')->with( + $this->callback(function (string $data) use ($body, $headers): bool { + $expectedMessage = json_encode([ + 'body' => $body, + 'headers' => $headers, + ]); + + return $expectedMessage === $data; + }), + 1024, + $expectedDelay, + 90 + )->willReturnOnConsecutiveCalls( + $this->throwException(new ConnectionException('123', 'foobar')), + new Job(new JobId($id), 'foobar'), + ); $connection = new Connection(['tube_name' => $tube], $client); @@ -520,4 +606,5 @@ public function testSendWithRoundedDelay() interface PheanstalkInterface extends PheanstalkPublisherInterface, PheanstalkSubscriberInterface, PheanstalkManagerInterface { + public function disconnect(): void; } diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php index 232d8596336cf..380186445889f 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php @@ -18,7 +18,6 @@ use Pheanstalk\Exception; use Pheanstalk\Exception\ConnectionException; use Pheanstalk\Pheanstalk; -use Pheanstalk\Values\Job as PheanstalkJob; use Pheanstalk\Values\JobId; use Pheanstalk\Values\TubeName; use Symfony\Component\Messenger\Exception\InvalidArgumentException; @@ -45,6 +44,9 @@ class Connection private int $ttr; private bool $buryOnReject; + private bool $usingTube = false; + private bool $watchingTube = false; + /** * Constructor. * @@ -139,7 +141,7 @@ public function send(string $body, array $headers, int $delay = 0, ?int $priorit } return $this->withReconnect(function () use ($message, $delay, $priority) { - $this->client->useTube($this->tube); + $this->useTube(); $job = $this->client->put( $message, $priority ?? PheanstalkPublisherInterface::DEFAULT_PRIORITY, @@ -153,7 +155,11 @@ public function send(string $body, array $headers, int $delay = 0, ?int $priorit public function get(): ?array { - $job = $this->getFromTube(); + $job = $this->withReconnect(function () { + $this->watchTube(); + + return $this->client->reserveWithTimeout($this->timeout); + }); if (null === $job) { return null; @@ -174,25 +180,10 @@ public function get(): ?array ]; } - private function getFromTube(): ?PheanstalkJob - { - return $this->withReconnect(function () { - if ($this->client->watch($this->tube) > 1) { - foreach ($this->client->listTubesWatched() as $tube) { - if ((string) $tube !== (string) $this->tube) { - $this->client->ignore($tube); - } - } - } - - return $this->client->reserveWithTimeout($this->timeout); - }); - } - public function ack(string $id): void { $this->withReconnect(function () use ($id) { - $this->client->useTube($this->tube); + $this->useTube(); $this->client->delete(new JobId($id)); }); } @@ -200,7 +191,7 @@ public function ack(string $id): void public function reject(string $id, ?int $priority = null, bool $forceDelete = false): void { $this->withReconnect(function () use ($id, $priority, $forceDelete) { - $this->client->useTube($this->tube); + $this->useTube(); if (!$forceDelete && $this->buryOnReject) { $this->client->bury(new JobId($id), $priority ?? PheanstalkPublisherInterface::DEFAULT_PRIORITY); @@ -213,7 +204,7 @@ public function reject(string $id, ?int $priority = null, bool $forceDelete = fa public function keepalive(string $id): void { $this->withReconnect(function () use ($id) { - $this->client->useTube($this->tube); + $this->useTube(); $this->client->touch(new JobId($id)); }); } @@ -221,7 +212,7 @@ public function keepalive(string $id): void public function getMessageCount(): int { return $this->withReconnect(function () { - $this->client->useTube($this->tube); + $this->useTube(); $tubeStats = $this->client->statsTube($this->tube); return $tubeStats->currentJobsReady; @@ -237,6 +228,33 @@ public function getMessagePriority(string $id): int }); } + private function useTube(): void + { + if ($this->usingTube) { + return; + } + + $this->client->useTube($this->tube); + $this->usingTube = true; + } + + private function watchTube(): void + { + if ($this->watchingTube) { + return; + } + + if ($this->client->watch($this->tube) > 1) { + foreach ($this->client->listTubesWatched() as $tube) { + if ((string) $tube !== (string) $this->tube) { + $this->client->ignore($tube); + } + } + } + + $this->watchingTube = true; + } + private function withReconnect(callable $command): mixed { try { @@ -245,6 +263,9 @@ private function withReconnect(callable $command): mixed } catch (ConnectionException) { $this->client->disconnect(); + $this->usingTube = false; + $this->watchingTube = false; + return $command(); } } catch (Exception $exception) { 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 aa87d8bebbe57..d1b9b67954abd 100644 --- a/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisExtIntegrationTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisExtIntegrationTest.php @@ -460,7 +460,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/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index a48e4c254ca25..c4eae318d3518 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -9,6 +9,7 @@ CHANGELOG * Add `Symfony\Component\Messenger\Middleware\DeduplicateMiddleware` and `Symfony\Component\Messenger\Stamp\DeduplicateStamp` * Add `--class-filter` option to the `messenger:failed:remove` command * Add `$stamps` parameter to `HandleTrait::handle` + * Add `Symfony\Component\Messenger\EventListener\ResetMemoryUsageListener` to reset PHP's peak memory usage for each processed message 7.2 --- 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 ff81188b87857..41985459c63f1 100644 --- a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php +++ b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php @@ -337,7 +337,7 @@ private function registerBusToCollector(ContainerBuilder $container, string $bus { $container->setDefinition( $tracedBusId = 'debug.traced.'.$busId, - (new Definition(TraceableMessageBus::class, [new Reference($tracedBusId.'.inner')]))->setDecoratedService($busId) + (new Definition(TraceableMessageBus::class, [new Reference($tracedBusId.'.inner'), new Reference('profiler.is_disabled_state_checker', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE)]))->setDecoratedService($busId) ); $container->getDefinition('data_collector.messenger')->addMethodCall('registerBus', [$busId, new Reference($tracedBusId)]); diff --git a/src/Symfony/Component/Messenger/EventListener/ResetMemoryUsageListener.php b/src/Symfony/Component/Messenger/EventListener/ResetMemoryUsageListener.php new file mode 100644 index 0000000000000..7a06501c508c8 --- /dev/null +++ b/src/Symfony/Component/Messenger/EventListener/ResetMemoryUsageListener.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent; +use Symfony\Component\Messenger\Event\WorkerRunningEvent; + +/** + * @author Tim Düsterhus + */ +final class ResetMemoryUsageListener implements EventSubscriberInterface +{ + private bool $collect = false; + + public function resetBefore(WorkerMessageReceivedEvent $event): void + { + // Reset the peak memory usage for accurate measurement of the + // memory usage on a per-message basis. + memory_reset_peak_usage(); + $this->collect = true; + } + + public function collectAfter(WorkerRunningEvent $event): void + { + if ($event->isWorkerIdle() && $this->collect) { + gc_collect_cycles(); + $this->collect = false; + } + } + + public static function getSubscribedEvents(): array + { + return [ + WorkerMessageReceivedEvent::class => ['resetBefore', -1024], + WorkerRunningEvent::class => ['collectAfter', -1024], + ]; + } +} diff --git a/src/Symfony/Component/Messenger/Stamp/DeduplicateStamp.php b/src/Symfony/Component/Messenger/Stamp/DeduplicateStamp.php index 4e08d5369f261..1b9ff480b4f49 100644 --- a/src/Symfony/Component/Messenger/Stamp/DeduplicateStamp.php +++ b/src/Symfony/Component/Messenger/Stamp/DeduplicateStamp.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Stamp; use Symfony\Component\Lock\Key; +use Symfony\Component\Messenger\Exception\LogicException; final class DeduplicateStamp implements StampInterface { @@ -22,6 +23,10 @@ public function __construct( private ?float $ttl = 300.0, private bool $onlyDeduplicateInQueue = false, ) { + if (!class_exists(Key::class)) { + throw new LogicException(\sprintf('You cannot use the "%s" as the Lock component is not installed. Try running "composer require symfony/lock".', self::class)); + } + $this->key = new Key($key); } diff --git a/src/Symfony/Component/Messenger/Tests/Transport/TransportFactoryTest.php b/src/Symfony/Component/Messenger/Tests/Transport/TransportFactoryTest.php new file mode 100644 index 0000000000000..b3a8647848b0c --- /dev/null +++ b/src/Symfony/Component/Messenger/Tests/Transport/TransportFactoryTest.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Tests\Transport; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Messenger\Exception\InvalidArgumentException; +use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; +use Symfony\Component\Messenger\Transport\TransportFactory; +use Symfony\Component\Messenger\Transport\TransportFactoryInterface; +use Symfony\Component\Messenger\Transport\TransportInterface; + +class TransportFactoryTest extends TestCase +{ + /** + * @dataProvider provideThrowsExceptionOnUnsupportedTransport + */ + public function testThrowsExceptionOnUnsupportedTransport(array $transportSupport, string $dsn, ?string $expectedMessage) + { + if (null !== $expectedMessage) { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage($expectedMessage); + } + $serializer = $this->createMock(SerializerInterface::class); + $factories = []; + foreach ($transportSupport as $supported) { + $factory = $this->createMock(TransportFactoryInterface::class); + $factory->method('supports', $dsn, [])->willReturn($supported); + $factories[] = $factory; + } + + $factory = new TransportFactory($factories); + $transport = $factory->createTransport($dsn, [], $serializer); + + if (null !== $expectedMessage) { + return; + } + + self::assertInstanceOf(TransportInterface::class, $transport); + } + + public static function provideThrowsExceptionOnUnsupportedTransport(): \Generator + { + yield 'transport supports dsn' => [ + [true], + 'foobar://barfoo', + null, + ]; + yield 'show dsn when no transport supports' => [ + [false], + 'foobar://barfoo', + 'No transport supports Messenger DSN "foobar://barfoo".', + ]; + yield 'empty dsn' => [ + [false], + '', + 'No transport supports the given Messenger DSN.', + ]; + yield 'dsn with no scheme' => [ + [false], + 'barfoo@bar', + 'No transport supports Messenger DSN "barfoo@bar".', + ]; + yield 'dsn with empty scheme ' => [ + [false], + '://barfoo@bar', + 'No transport supports Messenger DSN "://barfoo@bar".', + ]; + yield 'https dsn' => [ + [false], + 'https://sqs.foobar.amazonaws.com', + 'No transport supports Messenger DSN "https://sqs.foobar.amazonaws.com"', + ]; + yield 'with package suggestion amqp://' => [ + [false], + 'amqp://foo:barfoo@bar', + 'No transport supports Messenger DSN "amqp://foo:******@bar". Run "composer require symfony/amqp-messenger" to install AMQP transport.', + ]; + yield 'replaces password with stars' => [ + [false], + 'amqp://myuser:mypassword@broker:5672/vhost', + 'No transport supports Messenger DSN "amqp://myuser:******@broker:5672/vhost". Run "composer require symfony/amqp-messenger" to install AMQP transport.', + ]; + yield 'username only is blanked out (as this could be a secret token)' => [ + [false], + 'amqp://myuser@broker:5672/vhost', + 'No transport supports Messenger DSN "amqp://******@broker:5672/vhost". Run "composer require symfony/amqp-messenger" to install AMQP transport.', + ]; + yield 'empty password' => [ + [false], + 'amqp://myuser:@broker:5672/vhost', + 'No transport supports Messenger DSN "amqp://myuser:******@broker:5672/vhost". Run "composer require symfony/amqp-messenger" to install AMQP transport.', + ]; + } +} diff --git a/src/Symfony/Component/Messenger/Tests/WorkerTest.php b/src/Symfony/Component/Messenger/Tests/WorkerTest.php index 553368a193c09..adb50541a9104 100644 --- a/src/Symfony/Component/Messenger/Tests/WorkerTest.php +++ b/src/Symfony/Component/Messenger/Tests/WorkerTest.php @@ -26,6 +26,7 @@ use Symfony\Component\Messenger\Event\WorkerRunningEvent; use Symfony\Component\Messenger\Event\WorkerStartedEvent; use Symfony\Component\Messenger\Event\WorkerStoppedEvent; +use Symfony\Component\Messenger\EventListener\ResetMemoryUsageListener; use Symfony\Component\Messenger\EventListener\ResetServicesListener; use Symfony\Component\Messenger\EventListener\StopWorkerOnMessageLimitListener; use Symfony\Component\Messenger\Exception\RuntimeException; @@ -586,7 +587,7 @@ public function testFlushBatchOnStop() $this->assertSame($expectedMessages, $handler->processedMessages); } - public function testGcCollectCyclesIsCalledOnMessageHandle() + public function testGcCollectCyclesIsCalledOnIdleWorker() { $apiMessage = new DummyMessage('API'); @@ -595,14 +596,63 @@ public function testGcCollectCyclesIsCalledOnMessageHandle() $bus = $this->createMock(MessageBusInterface::class); $dispatcher = new EventDispatcher(); + $dispatcher->addSubscriber(new ResetMemoryUsageListener()); + $before = 0; + $dispatcher->addListener(WorkerRunningEvent::class, function (WorkerRunningEvent $event) use (&$before) { + static $i = 0; + + $after = gc_status()['runs']; + if (0 === $i) { + $this->assertFalse($event->isWorkerIdle()); + $this->assertSame(0, $after - $before); + } elseif (1 === $i) { + $this->assertTrue($event->isWorkerIdle()); + $this->assertSame(1, $after - $before); + } elseif (3 === $i) { + // Wait a few idle phases before stopping. + $this->assertSame(1, $after - $before); + $event->getWorker()->stop(); + } + + ++$i; + }, \PHP_INT_MIN); + + $worker = new Worker(['transport' => $receiver], $bus, $dispatcher); + + gc_collect_cycles(); + $before = gc_status()['runs']; + + $worker->run([ + 'sleep' => 0, + ]); + } + + public function testMemoryUsageIsResetOnMessageHandle() + { + $apiMessage = new DummyMessage('API'); + + $receiver = new DummyReceiver([[new Envelope($apiMessage)]]); + + $bus = $this->createMock(MessageBusInterface::class); + + $dispatcher = new EventDispatcher(); + $dispatcher->addSubscriber(new ResetMemoryUsageListener()); $dispatcher->addSubscriber(new StopWorkerOnMessageLimitListener(1)); + // Allocate and deallocate 4 MB. The use of random_int() is to + // prevent compile-time optimization. + $memory = str_repeat(random_int(0, 1), 4 * 1024 * 1024); + unset($memory); + + $before = memory_get_peak_usage(); + $worker = new Worker(['transport' => $receiver], $bus, $dispatcher); $worker->run(); - $gcStatus = gc_status(); + // This should be roughly 4 MB smaller than $before. + $after = memory_get_peak_usage(); - $this->assertGreaterThan(0, $gcStatus['runs']); + $this->assertTrue($after < $before); } /** diff --git a/src/Symfony/Component/Messenger/TraceableMessageBus.php b/src/Symfony/Component/Messenger/TraceableMessageBus.php index 7f0ac09219f18..b5fb6eea3782a 100644 --- a/src/Symfony/Component/Messenger/TraceableMessageBus.php +++ b/src/Symfony/Component/Messenger/TraceableMessageBus.php @@ -20,11 +20,16 @@ class TraceableMessageBus implements MessageBusInterface public function __construct( private MessageBusInterface $decoratedBus, + protected readonly ?\Closure $disabled = null, ) { } public function dispatch(object $message, array $stamps = []): Envelope { + if ($this->disabled?->__invoke()) { + return $this->decoratedBus->dispatch($message, $stamps); + } + $envelope = Envelope::wrap($message, $stamps); $context = [ 'stamps' => array_merge([], ...array_values($envelope->all())), diff --git a/src/Symfony/Component/Messenger/Transport/TransportFactory.php b/src/Symfony/Component/Messenger/Transport/TransportFactory.php index ae0db36d31127..e939a77ffa401 100644 --- a/src/Symfony/Component/Messenger/Transport/TransportFactory.php +++ b/src/Symfony/Component/Messenger/Transport/TransportFactory.php @@ -53,6 +53,10 @@ public function createTransport(#[\SensitiveParameter] string $dsn, array $optio $packageSuggestion = ' Run "composer require symfony/beanstalkd-messenger" to install Beanstalkd transport.'; } + if ($dsn = $this->santitizeDsn($dsn)) { + throw new InvalidArgumentException(\sprintf('No transport supports Messenger DSN "%s".', $dsn).$packageSuggestion); + } + throw new InvalidArgumentException('No transport supports the given Messenger DSN.'.$packageSuggestion); } @@ -66,4 +70,41 @@ public function supports(#[\SensitiveParameter] string $dsn, array $options): bo return false; } + + private function santitizeDsn(string $dsn): string + { + $parts = parse_url($dsn); + $dsn = ''; + + if (isset($parts['scheme'])) { + $dsn .= $parts['scheme'].'://'; + } + + if (isset($parts['user']) && !isset($parts['pass'])) { + $dsn .= '******'; + } elseif (isset($parts['user'])) { + $dsn .= $parts['user']; + } + + if (isset($parts['pass'])) { + $dsn .= ':******'; + } + + if (isset($parts['host'])) { + if (isset($parts['user'])) { + $dsn .= '@'; + } + $dsn .= $parts['host']; + } + + if (isset($parts['port'])) { + $dsn .= ':'.$parts['port']; + } + + if (isset($parts['path'])) { + $dsn .= $parts['path']; + } + + return $dsn; + } } 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/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php index b47a817ca551d..b3aad04279e93 100644 --- a/src/Symfony/Component/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php @@ -344,28 +344,28 @@ public function testReturnedMessageId() public static function sendMessageWithEmbedDataProvider(): iterable { yield 'With media' => [ - 'options' => (new BlueskyOptions())->attachMedia(new File(__DIR__.'/fixtures.gif'), 'A fixture'), - 'expectedResponse' => '{"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}}]}}}', + 'blueskyOptions' => (new BlueskyOptions())->attachMedia(new File(__DIR__.'/fixtures.gif'), 'A fixture'), + 'expectedJsonResponse' => '{"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}}]}}}', ]; yield 'With website preview card and all optionnal informations' => [ - 'options' => (new BlueskyOptions()) + 'blueskyOptions' => (new BlueskyOptions()) ->attachCard( 'https://example.com', new File(__DIR__.'/fixtures.gif'), 'Fork me im famous', 'Click here to go to website!' ), - 'expectedResponse' => '{"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.external","external":{"uri":"https:\/\/example.com","title":"Fork me im famous","description":"Click here to go to website!","thumb":{"$type":"blob","ref":{"$link":"bafkreibabalobzn6cd366ukcsjycp4yymjymgfxcv6xczmlgpemzkz3cfa"},"mimeType":"image\/png","size":760898}}}}}', + 'expectedJsonResponse' => '{"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.external","external":{"uri":"https:\/\/example.com","title":"Fork me im famous","description":"Click here to go to website!","thumb":{"$type":"blob","ref":{"$link":"bafkreibabalobzn6cd366ukcsjycp4yymjymgfxcv6xczmlgpemzkz3cfa"},"mimeType":"image\/png","size":760898}}}}}', ]; yield 'With website preview card and minimal information' => [ - 'options' => (new BlueskyOptions()) + 'blueskyOptions' => (new BlueskyOptions()) ->attachCard( 'https://example.com', new File(__DIR__.'/fixtures.gif') ), - 'expectedResponse' => '{"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.external","external":{"uri":"https:\/\/example.com","title":"","description":"","thumb":{"$type":"blob","ref":{"$link":"bafkreibabalobzn6cd366ukcsjycp4yymjymgfxcv6xczmlgpemzkz3cfa"},"mimeType":"image\/png","size":760898}}}}}', + 'expectedJsonResponse' => '{"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.external","external":{"uri":"https:\/\/example.com","title":"","description":"","thumb":{"$type":"blob","ref":{"$link":"bafkreibabalobzn6cd366ukcsjycp4yymjymgfxcv6xczmlgpemzkz3cfa"},"mimeType":"image\/png","size":760898}}}}}', ]; } 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/Mercure/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/Mercure/CHANGELOG.md index 1f2b652ac20ea..956a1d641042e 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mercure/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/Mercure/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +7.3 +--- + +* Add `content` option + 5.3 --- diff --git a/src/Symfony/Component/Notifier/Bridge/Mercure/MercureOptions.php b/src/Symfony/Component/Notifier/Bridge/Mercure/MercureOptions.php index e47a0113cd34b..85a513cee6901 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mercure/MercureOptions.php +++ b/src/Symfony/Component/Notifier/Bridge/Mercure/MercureOptions.php @@ -22,6 +22,21 @@ final class MercureOptions implements MessageOptionsInterface /** * @param string|string[]|null $topics + * @param array{ + * badge?: string, + * body?: string, + * data?: mixed, + * dir?: 'auto'|'ltr'|'rtl', + * icon?: string, + * image?: string, + * lang?: string, + * renotify?: bool, + * requireInteraction?: bool, + * silent?: bool, + * tag?: string, + * timestamp?: int, + * vibrate?: int|list, + * }|null $content */ public function __construct( string|array|null $topics = null, @@ -29,6 +44,7 @@ public function __construct( private ?string $id = null, private ?string $type = null, private ?int $retry = null, + private ?array $content = null, ) { $this->topics = null !== $topics ? (array) $topics : null; } @@ -61,6 +77,28 @@ public function getRetry(): ?int return $this->retry; } + /** + * @return array{ + * badge?: string, + * body?: string, + * data?: mixed, + * dir?: 'auto'|'ltr'|'rtl', + * icon?: string, + * image?: string, + * lang?: string, + * renotify?: bool, + * requireInteraction?: bool, + * silent?: bool, + * tag?: string, + * timestamp?: int, + * vibrate?: int|list, + * }|null + */ + public function getContent(): ?array + { + return $this->content; + } + public function toArray(): array { return [ @@ -69,6 +107,7 @@ public function toArray(): array 'id' => $this->id, 'type' => $this->type, 'retry' => $this->retry, + 'content' => $this->content, ]; } diff --git a/src/Symfony/Component/Notifier/Bridge/Mercure/MercureTransport.php b/src/Symfony/Component/Notifier/Bridge/Mercure/MercureTransport.php index 1be37a534ff88..cfdaed50964c2 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mercure/MercureTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Mercure/MercureTransport.php @@ -77,6 +77,8 @@ protected function doSend(MessageInterface $message): SentMessage '@context' => 'https://www.w3.org/ns/activitystreams', 'type' => 'Announce', 'summary' => $message->getSubject(), + 'mediaType' => 'application/json', + 'content' => $options->getContent(), ]), $options->isPrivate(), $options->getId(), $options->getType(), $options->getRetry()); try { diff --git a/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureOptionsTest.php b/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureOptionsTest.php index 7503f9e40456f..aa5d3ce8f024c 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureOptionsTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureOptionsTest.php @@ -24,12 +24,13 @@ public function testConstructWithDefaults() 'id' => null, 'type' => null, 'retry' => null, + 'content' => null, ]); } public function testConstructWithParameters() { - $options = (new MercureOptions('/topic/1', true, 'id', 'type', 1)); + $options = (new MercureOptions('/topic/1', true, 'id', 'type', 1, ['tag' => '1234', 'body' => 'TEST'])); $this->assertSame($options->toArray(), [ 'topics' => ['/topic/1'], @@ -37,6 +38,7 @@ public function testConstructWithParameters() 'id' => 'id', 'type' => 'type', 'retry' => 1, + 'content' => ['tag' => '1234', 'body' => 'TEST'], ]); } diff --git a/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureTransportTest.php index bfe9190a8e592..40b07f1ffc58b 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Mercure/Tests/MercureTransportTest.php @@ -114,7 +114,7 @@ public function testSendWithMercureOptions() { $hub = new MockHub('https://foo.com/.well-known/mercure', new StaticTokenProvider('foo'), function (Update $update): string { $this->assertSame(['/topic/1', '/topic/2'], $update->getTopics()); - $this->assertSame('{"@context":"https:\/\/www.w3.org\/ns\/activitystreams","type":"Announce","summary":"subject"}', $update->getData()); + $this->assertSame('{"@context":"https:\/\/www.w3.org\/ns\/activitystreams","type":"Announce","summary":"subject","mediaType":"application\/json","content":{"tag":"1234","body":"TEST"}}', $update->getData()); $this->assertSame('id', $update->getId()); $this->assertSame('type', $update->getType()); $this->assertSame(1, $update->getRetry()); @@ -123,14 +123,14 @@ public function testSendWithMercureOptions() return 'id'; }); - self::createTransport(null, $hub)->send(new ChatMessage('subject', new MercureOptions(['/topic/1', '/topic/2'], true, 'id', 'type', 1))); + self::createTransport(null, $hub)->send(new ChatMessage('subject', new MercureOptions(['/topic/1', '/topic/2'], true, 'id', 'type', 1, ['tag' => '1234', 'body' => 'TEST']))); } public function testSendWithMercureOptionsButWithoutOptionTopic() { $hub = new MockHub('https://foo.com/.well-known/mercure', new StaticTokenProvider('foo'), function (Update $update): string { $this->assertSame(['https://symfony.com/notifier'], $update->getTopics()); - $this->assertSame('{"@context":"https:\/\/www.w3.org\/ns\/activitystreams","type":"Announce","summary":"subject"}', $update->getData()); + $this->assertSame('{"@context":"https:\/\/www.w3.org\/ns\/activitystreams","type":"Announce","summary":"subject","mediaType":"application\/json","content":null}', $update->getData()); $this->assertSame('id', $update->getId()); $this->assertSame('type', $update->getType()); $this->assertSame(1, $update->getRetry()); @@ -146,7 +146,7 @@ public function testSendWithoutMercureOptions() { $hub = new MockHub('https://foo.com/.well-known/mercure', new StaticTokenProvider('foo'), function (Update $update): string { $this->assertSame(['https://symfony.com/notifier'], $update->getTopics()); - $this->assertSame('{"@context":"https:\/\/www.w3.org\/ns\/activitystreams","type":"Announce","summary":"subject"}', $update->getData()); + $this->assertSame('{"@context":"https:\/\/www.w3.org\/ns\/activitystreams","type":"Announce","summary":"subject","mediaType":"application\/json","content":null}', $update->getData()); $this->assertFalse($update->isPrivate()); return 'id'; diff --git a/src/Symfony/Component/Notifier/Bridge/Smsbox/composer.json b/src/Symfony/Component/Notifier/Bridge/Smsbox/composer.json index 259fb81e9bcae..0b1907fb71f15 100644 --- a/src/Symfony/Component/Notifier/Bridge/Smsbox/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Smsbox/composer.json @@ -31,7 +31,7 @@ "symfony/polyfill-php83": "^1.28" }, "require-dev": { - "symfony/webhook": "^6.4|^7.0|^7.2" + "symfony/webhook": "^6.4|^7.0" }, "autoload": { "psr-4": { 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/ObjectMapper/Attribute/Map.php b/src/Symfony/Component/ObjectMapper/Attribute/Map.php index f3057bf14cd26..143842221d496 100644 --- a/src/Symfony/Component/ObjectMapper/Attribute/Map.php +++ b/src/Symfony/Component/ObjectMapper/Attribute/Map.php @@ -19,7 +19,7 @@ * @author Antoine Bluchet */ #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_PROPERTY | \Attribute::IS_REPEATABLE)] -readonly class Map +class Map { /** * @param string|class-string|null $source The property or the class to map from @@ -28,10 +28,10 @@ * @param (string|callable(mixed, object): mixed)|(string|callable(mixed, object): mixed)[]|null $transform A service id or a callable that transforms the value during mapping */ public function __construct( - public ?string $target = null, - public ?string $source = null, - public mixed $if = null, - public mixed $transform = null, + public readonly ?string $target = null, + public readonly ?string $source = null, + public readonly mixed $if = null, + public readonly mixed $transform = null, ) { } } diff --git a/src/Symfony/Component/ObjectMapper/Condition/TargetClass.php b/src/Symfony/Component/ObjectMapper/Condition/TargetClass.php new file mode 100644 index 0000000000000..c44dccc840d24 --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Condition/TargetClass.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\ObjectMapper\Condition; + +use Symfony\Component\ObjectMapper\ConditionCallableInterface; + +/** + * @template T of object + * + * @implements ConditionCallableInterface + */ +final class TargetClass implements ConditionCallableInterface +{ + /** + * @param class-string $className + */ + public function __construct(private readonly string $className) + { + } + + public function __invoke(mixed $value, object $source, ?object $target): bool + { + return $target instanceof $this->className; + } +} diff --git a/src/Symfony/Component/ObjectMapper/ConditionCallableInterface.php b/src/Symfony/Component/ObjectMapper/ConditionCallableInterface.php index 778e917d66f38..05084591e1fbd 100644 --- a/src/Symfony/Component/ObjectMapper/ConditionCallableInterface.php +++ b/src/Symfony/Component/ObjectMapper/ConditionCallableInterface.php @@ -15,6 +15,7 @@ * Service used by "Map::if". * * @template T of object + * @template T2 of object * * @experimental * @@ -25,6 +26,7 @@ interface ConditionCallableInterface /** * @param mixed $value The value being mapped * @param T $source The object we're working on + * @param T2|null $target The target we're mapping to */ - public function __invoke(mixed $value, object $source): bool; + public function __invoke(mixed $value, object $source, ?object $target): bool; } diff --git a/src/Symfony/Component/ObjectMapper/Metadata/Mapping.php b/src/Symfony/Component/ObjectMapper/Metadata/Mapping.php index 455c0af79d2a7..a3318001f20ba 100644 --- a/src/Symfony/Component/ObjectMapper/Metadata/Mapping.php +++ b/src/Symfony/Component/ObjectMapper/Metadata/Mapping.php @@ -11,6 +11,8 @@ namespace Symfony\Component\ObjectMapper\Metadata; +use Symfony\Component\ObjectMapper\Attribute\Map; + /** * Configures a class or a property to map to. * @@ -18,19 +20,6 @@ * * @author Antoine Bluchet */ -readonly class Mapping +final class Mapping extends Map { - /** - * @param string|class-string|null $source The property or the class to map from - * @param string|class-string|null $target The property or the class to map to - * @param string|bool|callable(mixed, object): bool|null $if A boolean, Symfony service name or a callable that instructs whether to map - * @param (string|callable(mixed, object): mixed)|(string|callable(mixed, object): mixed)[]|null $transform A service id or a callable that transform the value during mapping - */ - public function __construct( - public ?string $target = null, - public ?string $source = null, - public mixed $if = null, - public mixed $transform = null, - ) { - } } diff --git a/src/Symfony/Component/ObjectMapper/ObjectMapper.php b/src/Symfony/Component/ObjectMapper/ObjectMapper.php index 6f2a47b621496..d78bc3ce8d216 100644 --- a/src/Symfony/Component/ObjectMapper/ObjectMapper.php +++ b/src/Symfony/Component/ObjectMapper/ObjectMapper.php @@ -50,7 +50,7 @@ public function map(object $source, object|string|null $target = null): object } $metadata = $this->metadataFactory->create($source); - $map = $this->getMapTarget($metadata, null, $source); + $map = $this->getMapTarget($metadata, null, $source, null); $target ??= $map?->target; $mappingToObject = \is_object($target); @@ -70,7 +70,7 @@ public function map(object $source, object|string|null $target = null): object $mappedTarget = $mappingToObject ? $target : $targetRefl->newInstanceWithoutConstructor(); if ($map && $map->transform) { - $mappedTarget = $this->applyTransforms($map, $mappedTarget, $mappedTarget); + $mappedTarget = $this->applyTransforms($map, $mappedTarget, $mappedTarget, null); if (!\is_object($mappedTarget)) { throw new MappingTransformException(\sprintf('Cannot map "%s" to a non-object target of type "%s".', get_debug_type($source), get_debug_type($mappedTarget))); @@ -122,12 +122,12 @@ public function map(object $source, object|string|null $target = null): object $sourcePropertyName = $mapping->source; } - $value = $this->getRawValue($source, $sourcePropertyName); - if (($if = $mapping->if) && ($fn = $this->getCallable($if, $this->conditionCallableLocator)) && !$this->call($fn, $value, $source)) { + if (false === $if = $mapping->if) { continue; } - if (false === $if) { + $value = $this->getRawValue($source, $sourcePropertyName); + if ($if && ($fn = $this->getCallable($if, $this->conditionCallableLocator)) && !$this->call($fn, $value, $source, $mappedTarget)) { continue; } @@ -173,16 +173,16 @@ private function getRawValue(object $source, string $propertyName): mixed private function getSourceValue(object $source, object $target, mixed $value, \SplObjectStorage $objectMap, ?Mapping $mapping = null): mixed { if ($mapping?->transform) { - $value = $this->applyTransforms($mapping, $value, $source); + $value = $this->applyTransforms($mapping, $value, $source, $target); } if ( \is_object($value) && ($innerMetadata = $this->metadataFactory->create($value)) - && ($mapTo = $this->getMapTarget($innerMetadata, $value, $source)) + && ($mapTo = $this->getMapTarget($innerMetadata, $value, $source, $target)) && (\is_string($mapTo->target) && class_exists($mapTo->target)) ) { - $value = $this->applyTransforms($mapTo, $value, $source); + $value = $this->applyTransforms($mapTo, $value, $source, $target); if ($value === $source) { $value = $target; @@ -216,23 +216,23 @@ private function storeValue(string $propertyName, array &$mapToProperties, array /** * @param callable(): mixed $fn */ - private function call(callable $fn, mixed $value, object $object): mixed + private function call(callable $fn, mixed $value, object $source, ?object $target = null): mixed { if (\is_string($fn)) { return \call_user_func($fn, $value); } - return $fn($value, $object); + return $fn($value, $source, $target); } /** * @param Mapping[] $metadata */ - private function getMapTarget(array $metadata, mixed $value, object $source): ?Mapping + private function getMapTarget(array $metadata, mixed $value, object $source, ?object $target): ?Mapping { $mapTo = null; foreach ($metadata as $mapAttribute) { - if (($if = $mapAttribute->if) && ($fn = $this->getCallable($if, $this->conditionCallableLocator)) && !$this->call($fn, $value, $source)) { + if (($if = $mapAttribute->if) && ($fn = $this->getCallable($if, $this->conditionCallableLocator)) && !$this->call($fn, $value, $source, $target)) { continue; } @@ -242,7 +242,7 @@ private function getMapTarget(array $metadata, mixed $value, object $source): ?M return $mapTo; } - private function applyTransforms(Mapping $map, mixed $value, object $object): mixed + private function applyTransforms(Mapping $map, mixed $value, object $source, ?object $target): mixed { if (!$transforms = $map->transform) { return $value; @@ -256,7 +256,7 @@ private function applyTransforms(Mapping $map, mixed $value, object $object): mi foreach ($transforms as $transform) { if ($fn = $this->getCallable($transform, $this->transformCallableLocator)) { - $value = $this->call($fn, $value, $object); + $value = $this->call($fn, $value, $source, $target); } } @@ -298,7 +298,7 @@ private function getSourceReflectionClass(object $source, \ReflectionClass $targ } foreach ($refl->getProperties() as $property) { - if ($this->metadataFactory->create($source, $property)) { + if ($this->metadataFactory->create($source, $property->getName())) { return $refl; } } diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/HydrateObject/SourceOnly.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/HydrateObject/SourceOnly.php index 9e3127b80d965..c062427c6e8d0 100644 --- a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/HydrateObject/SourceOnly.php +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/HydrateObject/SourceOnly.php @@ -15,7 +15,9 @@ class SourceOnly { - public function __construct(#[Map(source: 'name')] public string $mappedName) - { + public function __construct( + #[Map(source: 'name')] public string $mappedName, + #[Map(if: false)] public ?string $mappedDescription = null + ) { } } diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapStruct/Map.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapStruct/Map.php index 8dd0ead33bdf9..4501042def9f3 100644 --- a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapStruct/Map.php +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapStruct/Map.php @@ -14,6 +14,6 @@ use Symfony\Component\ObjectMapper\Attribute\Map as AttributeMap; #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] -readonly class Map extends AttributeMap +class Map extends AttributeMap { } diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapTargetToSource/A.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapTargetToSource/A.php new file mode 100644 index 0000000000000..859602b49f00f --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapTargetToSource/A.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\ObjectMapper\Tests\Fixtures\MapTargetToSource; + +class A +{ + public function __construct(public string $source) + { + } +} diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapTargetToSource/B.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapTargetToSource/B.php new file mode 100644 index 0000000000000..6a826607097f6 --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MapTargetToSource/B.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\ObjectMapper\Tests\Fixtures\MapTargetToSource; + +use Symfony\Component\ObjectMapper\Attribute\Map; + +#[Map(source: A::class)] +class B +{ + public function __construct(#[Map(source: 'source')] public string $target) + { + } +} diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/A.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/A.php new file mode 100644 index 0000000000000..34ff470a1cf17 --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/A.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\ObjectMapper\Tests\Fixtures\MultipleTargetProperty; + +use Symfony\Component\ObjectMapper\Attribute\Map; +use Symfony\Component\ObjectMapper\Condition\TargetClass; + +#[Map(target: B::class)] +#[Map(target: C::class)] +class A +{ + #[Map(target: 'foo', transform: 'strtoupper', if: new TargetClass(B::class))] + #[Map(target: 'bar')] + public string $something = 'test'; + + public string $doesNotExistInTargetB = 'foo'; +} diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/B.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/B.php new file mode 100644 index 0000000000000..c49094b7c549c --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/B.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\ObjectMapper\Tests\Fixtures\MultipleTargetProperty; + +class B +{ + public string $foo; +} diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/C.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/C.php new file mode 100644 index 0000000000000..71a390cda5c54 --- /dev/null +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/MultipleTargetProperty/C.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\ObjectMapper\Tests\Fixtures\MultipleTargetProperty; + +class C +{ + public string $foo = 'donotmap'; + public string $bar; + public string $doesNotExistInTargetB; +} diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/ConditionCallable.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/ConditionCallable.php index b7d42889e3742..bc7c9314f9886 100644 --- a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/ConditionCallable.php +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/ConditionCallable.php @@ -18,7 +18,7 @@ */ class ConditionCallable implements ConditionCallableInterface { - public function __invoke(mixed $value, object $object): bool + public function __invoke(mixed $value, object $source, ?object $target): bool { return 'ok' === $value; } diff --git a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/TransformCallable.php b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/TransformCallable.php index 2d34e696e8fc4..5ba5c66705e34 100644 --- a/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/TransformCallable.php +++ b/src/Symfony/Component/ObjectMapper/Tests/Fixtures/ServiceLocator/TransformCallable.php @@ -18,7 +18,7 @@ */ class TransformCallable implements TransformCallableInterface { - public function __invoke(mixed $value, object $object): mixed + public function __invoke(mixed $value, object $source, ?object $target): mixed { return "transformed$value"; } diff --git a/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php b/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php index d4f108dfeb32f..a416abd47933b 100644 --- a/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php +++ b/src/Symfony/Component/ObjectMapper/Tests/ObjectMapperTest.php @@ -38,6 +38,11 @@ use Symfony\Component\ObjectMapper\Tests\Fixtures\MapStruct\MapStructMapperMetadataFactory; use Symfony\Component\ObjectMapper\Tests\Fixtures\MapStruct\Source; use Symfony\Component\ObjectMapper\Tests\Fixtures\MapStruct\Target; +use Symfony\Component\ObjectMapper\Tests\Fixtures\MapTargetToSource\A as MapTargetToSourceA; +use Symfony\Component\ObjectMapper\Tests\Fixtures\MapTargetToSource\B as MapTargetToSourceB; +use Symfony\Component\ObjectMapper\Tests\Fixtures\MultipleTargetProperty\A as MultipleTargetPropertyA; +use Symfony\Component\ObjectMapper\Tests\Fixtures\MultipleTargetProperty\B as MultipleTargetPropertyB; +use Symfony\Component\ObjectMapper\Tests\Fixtures\MultipleTargetProperty\C as MultipleTargetPropertyC; use Symfony\Component\ObjectMapper\Tests\Fixtures\MultipleTargets\A as MultipleTargetsA; use Symfony\Component\ObjectMapper\Tests\Fixtures\MultipleTargets\C as MultipleTargetsC; use Symfony\Component\ObjectMapper\Tests\Fixtures\Recursion\AB; @@ -262,4 +267,28 @@ public function testTransformToWrongObject() $mapper = new ObjectMapper($metadata); $mapper->map($u); } + + public function testMapTargetToSource() + { + $a = new MapTargetToSourceA('str'); + $mapper = new ObjectMapper(); + $b = $mapper->map($a, MapTargetToSourceB::class); + $this->assertInstanceOf(MapTargetToSourceB::class, $b); + $this->assertSame('str', $b->target); + } + + public function testMultipleTargetMapProperty() + { + $u = new MultipleTargetPropertyA(); + + $mapper = new ObjectMapper(); + $b = $mapper->map($u, MultipleTargetPropertyB::class); + $this->assertInstanceOf(MultipleTargetPropertyB::class, $b); + $this->assertEquals($b->foo, 'TEST'); + $c = $mapper->map($u, MultipleTargetPropertyC::class); + $this->assertInstanceOf(MultipleTargetPropertyC::class, $c); + $this->assertEquals($c->bar, 'test'); + $this->assertEquals($c->foo, 'donotmap'); + $this->assertEquals($c->doesNotExistInTargetB, 'foo'); + } } diff --git a/src/Symfony/Component/ObjectMapper/TransformCallableInterface.php b/src/Symfony/Component/ObjectMapper/TransformCallableInterface.php index 401df932de2ae..f8c296b4c26d5 100644 --- a/src/Symfony/Component/ObjectMapper/TransformCallableInterface.php +++ b/src/Symfony/Component/ObjectMapper/TransformCallableInterface.php @@ -15,6 +15,7 @@ * Service used by "Map::transform". * * @template T of object + * @template T2 of object * * @experimental * @@ -25,6 +26,7 @@ interface TransformCallableInterface /** * @param mixed $value The value being mapped * @param T $source The object we're working on + * @param T2|null $target The target we're mapping to */ - public function __invoke(mixed $value, object $source): mixed; + public function __invoke(mixed $value, object $source, ?object $target): mixed; } diff --git a/src/Symfony/Component/ObjectMapper/composer.json b/src/Symfony/Component/ObjectMapper/composer.json index eb89582d8aad6..6d1b445d92781 100644 --- a/src/Symfony/Component/ObjectMapper/composer.json +++ b/src/Symfony/Component/ObjectMapper/composer.json @@ -32,5 +32,6 @@ }, "conflict": { "symfony/property-access": "<7.2" - } + }, + "minimum-stability": "dev" } diff --git a/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php b/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php index c92aa20c2df08..411e161696c43 100644 --- a/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php +++ b/src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php @@ -13,7 +13,7 @@ use PHPUnit\Framework\Assert; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector; use Symfony\Component\OptionsResolver\Exception\AccessException; use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException; @@ -27,7 +27,7 @@ class OptionsResolverTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; private OptionsResolver $resolver; @@ -1099,7 +1099,7 @@ public function testFailIfSetAllowedValuesFromLazyOption() */ public function testLegacyResolveFailsIfInvalidValueFromNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefault('foo', function (OptionsResolver $resolver) { $resolver @@ -1118,7 +1118,7 @@ public function testLegacyResolveFailsIfInvalidValueFromNestedOption() */ public function testLegacyResolveFailsIfInvalidTypeFromNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefault('foo', function (OptionsResolver $resolver) { $resolver @@ -2116,7 +2116,7 @@ public function testNestedArrayException5() */ public function testLegacyIsNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'database' => function (OptionsResolver $resolver) { @@ -2131,7 +2131,7 @@ public function testLegacyIsNestedOption() */ public function testLegacyFailsIfUndefinedNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'name' => 'default', @@ -2153,7 +2153,7 @@ public function testLegacyFailsIfUndefinedNestedOption() */ public function testLegacyFailsIfMissingRequiredNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'name' => 'default', @@ -2175,7 +2175,7 @@ public function testLegacyFailsIfMissingRequiredNestedOption() */ public function testLegacyFailsIfInvalidTypeNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'name' => 'default', @@ -2199,7 +2199,7 @@ public function testLegacyFailsIfInvalidTypeNestedOption() */ public function testLegacyFailsIfNotArrayIsGivenForNestedOptions() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'name' => 'default', @@ -2221,7 +2221,7 @@ public function testLegacyFailsIfNotArrayIsGivenForNestedOptions() */ public function testLegacyResolveNestedOptionsWithoutDefault() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'name' => 'default', @@ -2242,7 +2242,7 @@ public function testLegacyResolveNestedOptionsWithoutDefault() */ public function testLegacyResolveNestedOptionsWithDefault() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'name' => 'default', @@ -2269,7 +2269,7 @@ public function testLegacyResolveNestedOptionsWithDefault() */ public function testLegacyResolveMultipleNestedOptions() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'name' => 'default', @@ -2313,7 +2313,7 @@ public function testLegacyResolveMultipleNestedOptions() */ public function testLegacyResolveLazyOptionUsingNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'version' => fn (Options $options) => $options['database']['server_version'], @@ -2334,7 +2334,7 @@ public function testLegacyResolveLazyOptionUsingNestedOption() */ public function testLegacyNormalizeNestedOptionValue() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver ->setDefaults([ @@ -2365,7 +2365,7 @@ public function testLegacyNormalizeNestedOptionValue() */ public function testOverwrittenNestedOptionNotEvaluatedIfLazyDefault() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); // defined by superclass $this->resolver->setDefault('foo', function (OptionsResolver $resolver) { @@ -2381,7 +2381,7 @@ public function testOverwrittenNestedOptionNotEvaluatedIfLazyDefault() */ public function testOverwrittenNestedOptionNotEvaluatedIfScalarDefault() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); // defined by superclass $this->resolver->setDefault('foo', function (OptionsResolver $resolver) { @@ -2397,7 +2397,7 @@ public function testOverwrittenNestedOptionNotEvaluatedIfScalarDefault() */ public function testOverwrittenLazyOptionNotEvaluatedIfNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); // defined by superclass $this->resolver->setDefault('foo', function (Options $options) { @@ -2415,7 +2415,7 @@ public function testOverwrittenLazyOptionNotEvaluatedIfNestedOption() */ public function testLegacyResolveAllNestedOptionDefinitions() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); // defined by superclass $this->resolver->setDefault('foo', function (OptionsResolver $resolver) { @@ -2437,7 +2437,7 @@ public function testLegacyResolveAllNestedOptionDefinitions() */ public function testLegacyNormalizeNestedValue() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); // defined by superclass $this->resolver->setDefault('foo', function (OptionsResolver $resolver) { @@ -2457,7 +2457,7 @@ public function testLegacyNormalizeNestedValue() */ public function testLegacyFailsIfCyclicDependencyBetweenSameNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefault('database', function (OptionsResolver $resolver, Options $parent) { $resolver->setDefault('replicas', $parent['database']); @@ -2473,7 +2473,7 @@ public function testLegacyFailsIfCyclicDependencyBetweenSameNestedOption() */ public function testLegacyFailsIfCyclicDependencyBetweenNestedOptionAndParentLazyOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'version' => fn (Options $options) => $options['database']['server_version'], @@ -2492,7 +2492,7 @@ public function testLegacyFailsIfCyclicDependencyBetweenNestedOptionAndParentLaz */ public function testLegacyFailsIfCyclicDependencyBetweenNormalizerAndNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver ->setDefault('name', 'default') @@ -2513,7 +2513,7 @@ public function testLegacyFailsIfCyclicDependencyBetweenNormalizerAndNestedOptio */ public function testLegacyFailsIfCyclicDependencyBetweenNestedOptions() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefault('database', function (OptionsResolver $resolver, Options $parent) { $resolver->setDefault('host', $parent['replica']['host']); @@ -2532,7 +2532,7 @@ public function testLegacyFailsIfCyclicDependencyBetweenNestedOptions() */ public function testLegacyGetAccessToParentOptionFromNestedOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'version' => 3.15, @@ -2566,7 +2566,7 @@ public function testNestedClosureWithoutTypeHint2ndArgumentNotInvoked() */ public function testLegacyResolveLazyOptionWithTransitiveDefaultDependency() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'ip' => null, @@ -2595,7 +2595,7 @@ public function testLegacyResolveLazyOptionWithTransitiveDefaultDependency() */ public function testLegacyAccessToParentOptionFromNestedNormalizerAndLazyOption() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver->setDefaults([ 'debug' => true, @@ -2726,7 +2726,7 @@ public function testInfoOnInvalidValue() */ public function testLegacyInvalidValueForPrototypeDefinition() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver ->setDefault('connections', static function (OptionsResolver $resolver) { @@ -2746,7 +2746,7 @@ public function testLegacyInvalidValueForPrototypeDefinition() */ public function testLegacyMissingOptionForPrototypeDefinition() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver ->setDefault('connections', static function (OptionsResolver $resolver) { @@ -2777,7 +2777,7 @@ public function testAccessExceptionOnPrototypeDefinition() */ public function testLegacyPrototypeDefinition() { - $this->expectDeprecation('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); + $this->expectUserDeprecationMessage('Since symfony/options-resolver 7.3: Defining nested options via "Symfony\Component\OptionsResolver\OptionsResolver::setDefault()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.'); $this->resolver ->setDefault('connections', static function (OptionsResolver $resolver) { diff --git a/src/Symfony/Component/Process/PhpExecutableFinder.php b/src/Symfony/Component/Process/PhpExecutableFinder.php index 9f9218f98e528..f9ed79e4d7f2a 100644 --- a/src/Symfony/Component/Process/PhpExecutableFinder.php +++ b/src/Symfony/Component/Process/PhpExecutableFinder.php @@ -83,6 +83,8 @@ public function find(bool $includeArgs = true): string|false /** * Finds the PHP executable arguments. + * + * @return list */ public function findArguments(): array { diff --git a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php index 7066e1545e7d6..d34e19f0c9b19 100644 --- a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php +++ b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php @@ -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))) { diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ConstructorExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ConstructorExtractorTest.php index 3ff7757a2f21a..6f6b7849f59b9 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ConstructorExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ConstructorExtractorTest.php @@ -12,7 +12,7 @@ namespace Symfony\Component\PropertyInfo\Tests\Extractor; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor; use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyExtractor; use Symfony\Component\PropertyInfo\Type as LegacyType; @@ -23,7 +23,7 @@ */ class ConstructorExtractorTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; private ConstructorExtractor $extractor; @@ -53,7 +53,7 @@ public function testGetTypeIfNoExtractors() */ public function testGetTypes() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getType()" instead.'); $this->assertEquals([new LegacyType(LegacyType::BUILTIN_TYPE_STRING)], $this->extractor->getTypes('Foo', 'bar', [])); } @@ -63,7 +63,7 @@ public function testGetTypes() */ public function testGetTypesIfNoExtractors() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor::getType()" instead.'); $extractor = new ConstructorExtractor([]); $this->assertNull($extractor->getTypes('Foo', 'bar', [])); diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpDocExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpDocExtractorTest.php index e956ec0f27f75..f86527ad59f01 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpDocExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpDocExtractorTest.php @@ -11,9 +11,9 @@ namespace Symfony\Component\PropertyInfo\Tests\Extractor; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use phpDocumentor\Reflection\DocBlock; use PHPUnit\Framework\TestCase; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; use Symfony\Component\PropertyInfo\Tests\Fixtures\ConstructorDummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\DockBlockFallback; @@ -35,7 +35,7 @@ */ class PhpDocExtractorTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; private PhpDocExtractor $extractor; @@ -51,7 +51,7 @@ protected function setUp(): void */ public function testExtractLegacy($property, ?array $type, $shortDescription, $longDescription) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes(Dummy::class, $property)); $this->assertSame($shortDescription, $this->extractor->getShortDescription(Dummy::class, $property)); @@ -76,7 +76,7 @@ public function testGetDocBlock() */ public function testParamTagTypeIsOmittedLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertNull($this->extractor->getTypes(OmittedParamTagTypeDocBlock::class, 'omittedType')); } @@ -97,7 +97,7 @@ public static function provideLegacyInvalidTypes() */ public function testInvalidLegacy($property, $shortDescription, $longDescription) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertNull($this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\InvalidDummy', $property)); $this->assertSame($shortDescription, $this->extractor->getShortDescription('Symfony\Component\PropertyInfo\Tests\Fixtures\InvalidDummy', $property)); @@ -109,7 +109,7 @@ public function testInvalidLegacy($property, $shortDescription, $longDescription */ public function testEmptyParamAnnotationLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertNull($this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\InvalidDummy', 'foo')); $this->assertSame('Foo.', $this->extractor->getShortDescription('Symfony\Component\PropertyInfo\Tests\Fixtures\InvalidDummy', 'foo')); @@ -123,7 +123,7 @@ public function testEmptyParamAnnotationLegacy() */ public function testExtractTypesWithNoPrefixesLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $noPrefixExtractor = new PhpDocExtractor(null, [], [], []); @@ -253,7 +253,7 @@ public static function provideLegacyCollectionTypes() */ public function testExtractTypesWithCustomPrefixesLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $customExtractor = new PhpDocExtractor(null, ['add', 'remove'], ['is', 'can']); @@ -371,7 +371,7 @@ public static function provideLegacyDockBlockFallbackTypes() */ public function testDocBlockFallbackLegacy($property, $types) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals($types, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\DockBlockFallback', $property)); } @@ -383,7 +383,7 @@ public function testDocBlockFallbackLegacy($property, $types) */ public function testPropertiesDefinedByTraitsLegacy(string $property, LegacyType $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals([$type], $this->extractor->getTypes(DummyUsingTrait::class, $property)); } @@ -407,7 +407,7 @@ public static function provideLegacyPropertiesDefinedByTraits(): array */ public function testMethodsDefinedByTraitsLegacy(string $property, LegacyType $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals([$type], $this->extractor->getTypes(DummyUsingTrait::class, $property)); } @@ -431,7 +431,7 @@ public static function provideLegacyMethodsDefinedByTraits(): array */ public function testPropertiesStaticTypeLegacy(string $class, string $property, LegacyType $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals([$type], $this->extractor->getTypes($class, $property)); } @@ -451,7 +451,7 @@ public static function provideLegacyPropertiesStaticType(): array */ public function testPropertiesParentTypeLegacy(string $class, string $property, ?array $types) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals($types, $this->extractor->getTypes($class, $property)); } @@ -469,7 +469,7 @@ public static function provideLegacyPropertiesParentType(): array */ public function testUnknownPseudoTypeLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals([new LegacyType(LegacyType::BUILTIN_TYPE_OBJECT, false, 'scalar')], $this->extractor->getTypes(PseudoTypeDummy::class, 'unknownPseudoType')); } @@ -479,7 +479,7 @@ public function testUnknownPseudoTypeLegacy() */ public function testGenericInterface() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertNull($this->extractor->getTypes(Dummy::class, 'genericInterface')); } @@ -491,7 +491,7 @@ public function testGenericInterface() */ public function testExtractConstructorTypesLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypeFromConstructor()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypeFromConstructor()" instead.'); $this->assertEquals($type, $this->extractor->getTypesFromConstructor('Symfony\Component\PropertyInfo\Tests\Fixtures\ConstructorDummy', $property)); } @@ -515,7 +515,7 @@ public static function provideLegacyConstructorTypes() */ public function testPseudoTypesLegacy($property, array $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\PseudoTypesDummy', $property)); } @@ -542,7 +542,7 @@ public static function provideLegacyPseudoTypes(): array */ public function testExtractPromotedPropertyLegacy(string $property, ?array $types) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor::getType()" instead.'); $this->assertEquals($types, $this->extractor->getTypes(Php80Dummy::class, $property)); } diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php index 10e9c9674e0b2..a7d36203d49c6 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php @@ -12,7 +12,7 @@ namespace Symfony\Component\PropertyInfo\Tests\Extractor; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; use Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor; use Symfony\Component\PropertyInfo\Tests\Fixtures\Clazz; @@ -49,7 +49,7 @@ */ class PhpStanExtractorTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; private PhpStanExtractor $extractor; private PhpDocExtractor $phpDocExtractor; @@ -67,7 +67,7 @@ protected function setUp(): void */ public function testExtractLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy', $property)); } @@ -77,7 +77,7 @@ public function testExtractLegacy($property, ?array $type = null) */ public function testParamTagTypeIsOmittedLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertNull($this->extractor->getTypes(PhpStanOmittedParamTagTypeDocBlock::class, 'omittedType')); } @@ -99,7 +99,7 @@ public static function provideLegacyInvalidTypes() */ public function testInvalidLegacy($property) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertNull($this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\InvalidDummy', $property)); } @@ -111,7 +111,7 @@ public function testInvalidLegacy($property) */ public function testExtractTypesWithNoPrefixesLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $noPrefixExtractor = new PhpStanExtractor([], [], []); @@ -229,7 +229,7 @@ public static function provideLegacyCollectionTypes() */ public function testExtractTypesWithCustomPrefixesLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $customExtractor = new PhpStanExtractor(['add', 'remove'], ['is', 'can']); @@ -334,7 +334,7 @@ public static function provideLegacyDockBlockFallbackTypes() */ public function testDocBlockFallbackLegacy($property, $types) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($types, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\DockBlockFallback', $property)); } @@ -346,7 +346,7 @@ public function testDocBlockFallbackLegacy($property, $types) */ public function testPropertiesDefinedByTraitsLegacy(string $property, LegacyType $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals([$type], $this->extractor->getTypes(DummyUsingTrait::class, $property)); } @@ -368,7 +368,7 @@ public static function provideLegacyPropertiesDefinedByTraits(): array */ public function testPropertiesStaticTypeLegacy(string $class, string $property, LegacyType $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals([$type], $this->extractor->getTypes($class, $property)); } @@ -388,7 +388,7 @@ public static function provideLegacyPropertiesStaticType(): array */ public function testPropertiesParentTypeLegacy(string $class, string $property, ?array $types) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($types, $this->extractor->getTypes($class, $property)); } @@ -408,7 +408,7 @@ public static function provideLegacyPropertiesParentType(): array */ public function testExtractConstructorTypesLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypeFromConstructor()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypeFromConstructor()" instead.'); $this->assertEquals($type, $this->extractor->getTypesFromConstructor('Symfony\Component\PropertyInfo\Tests\Fixtures\ConstructorDummy', $property)); } @@ -420,7 +420,7 @@ public function testExtractConstructorTypesLegacy($property, ?array $type = null */ public function testExtractConstructorTypesReturnNullOnEmptyDocBlockLegacy($property) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypeFromConstructor()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypeFromConstructor()" instead.'); $this->assertNull($this->extractor->getTypesFromConstructor(ConstructorDummyWithoutDocBlock::class, $property)); } @@ -443,7 +443,7 @@ public static function provideLegacyConstructorTypes() */ public function testExtractorUnionTypesLegacy(string $property, ?array $types) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($types, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\DummyUnionType', $property)); } @@ -468,7 +468,7 @@ public static function provideLegacyUnionTypes(): array */ public function testPseudoTypesLegacy($property, array $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\PhpStanPseudoTypesDummy', $property)); } @@ -506,7 +506,7 @@ public static function provideLegacyPseudoTypes(): array */ public function testDummyNamespaceLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals( [new LegacyType(LegacyType::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy')], @@ -519,7 +519,7 @@ public function testDummyNamespaceLegacy() */ public function testDummyNamespaceWithPropertyLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $phpStanTypes = $this->extractor->getTypes(\B\Dummy::class, 'property'); $phpDocTypes = $this->phpDocExtractor->getTypes(\B\Dummy::class, 'property'); @@ -535,7 +535,7 @@ public function testDummyNamespaceWithPropertyLegacy() */ public function testExtractorIntRangeTypeLegacy(string $property, ?array $types) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($types, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\IntRangeDummy', $property)); } @@ -556,7 +556,7 @@ public static function provideLegacyIntRangeType(): array */ public function testExtractPhp80TypeLegacy(string $class, $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes($class, $property, [])); } @@ -580,7 +580,7 @@ public static function provideLegacyPhp80Types() */ public function testAllowPrivateAccessLegacy(bool $allowPrivateAccess, array $expectedTypes) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $extractor = new PhpStanExtractor(allowPrivateAccess: $allowPrivateAccess); $this->assertEquals( @@ -606,7 +606,7 @@ public static function allowPrivateAccessLegacyProvider(): array */ public function testGenericsLegacy(string $property, array $expectedTypes) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor::getType()" instead.'); $this->assertEquals($expectedTypes, $this->extractor->getTypes(DummyGeneric::class, $property)); } diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php index 0c501c6956926..fbf365ea5f2c4 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php @@ -12,7 +12,7 @@ namespace Symfony\Component\PropertyInfo\Tests\Extractor; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\PropertyInfo\PropertyReadInfo; use Symfony\Component\PropertyInfo\PropertyWriteInfo; @@ -43,7 +43,7 @@ */ class ReflectionExtractorTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; private ReflectionExtractor $extractor; @@ -230,7 +230,7 @@ public function testGetPropertiesWithNoPrefixes() */ public function testExtractorsLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy', $property, [])); } @@ -261,7 +261,7 @@ public static function provideLegacyTypes() */ public function testExtractPhp7TypeLegacy(string $class, string $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes($class, $property, [])); } @@ -286,7 +286,7 @@ public static function provideLegacyPhp7Types() */ public function testExtractPhp71TypeLegacy($property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Php71Dummy', $property, [])); } @@ -309,7 +309,7 @@ public static function provideLegacyPhp71Types() */ public function testExtractPhp80TypeLegacy(string $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Php80Dummy', $property, [])); } @@ -335,7 +335,7 @@ public static function provideLegacyPhp80Types() */ public function testExtractPhp81TypeLegacy(string $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Php81Dummy', $property, [])); } @@ -360,7 +360,7 @@ public function testReadonlyPropertiesAreNotWriteable() */ public function testExtractPhp82TypeLegacy(string $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Php82Dummy', $property, [])); } @@ -383,7 +383,7 @@ public static function provideLegacyPhp82Types(): iterable */ public function testExtractWithDefaultValueLegacy($property, $type) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals($type, $this->extractor->getTypes(DefaultValue::class, $property, [])); } @@ -528,7 +528,7 @@ public static function getInitializableProperties(): array */ public function testExtractTypeConstructorLegacy(string $class, string $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); /* Check that constructor extractions works by default, and if passed in via context. Check that null is returned if constructor extraction is disabled */ @@ -568,7 +568,7 @@ public function testNullOnPrivateProtectedAccessor() */ public function testTypedPropertiesLegacy() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getType()" instead.'); $this->assertEquals([new LegacyType(LegacyType::BUILTIN_TYPE_OBJECT, false, Dummy::class)], $this->extractor->getTypes(Php74Dummy::class, 'dummy')); $this->assertEquals([new LegacyType(LegacyType::BUILTIN_TYPE_BOOL, true)], $this->extractor->getTypes(Php74Dummy::class, 'nullableBoolProp')); @@ -708,7 +708,7 @@ public function testGetWriteInfoReadonlyProperties() */ public function testExtractConstructorTypesLegacy(string $property, ?array $type = null) { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypeFromConstructor()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypesFromConstructor()" method is deprecated, use "Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor::getTypeFromConstructor()" instead.'); $this->assertEquals($type, $this->extractor->getTypesFromConstructor('Symfony\Component\PropertyInfo\Tests\Fixtures\ConstructorDummy', $property)); } diff --git a/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php index ad6398ceca82f..fda169d3efc93 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php @@ -11,7 +11,7 @@ namespace Symfony\Component\PropertyInfo\Tests; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\Cache\Adapter\ArrayAdapter; use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; use Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor; @@ -26,7 +26,7 @@ */ class PropertyInfoCacheExtractorTest extends AbstractPropertyInfoExtractorTest { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; protected function setUp(): void { @@ -58,7 +58,7 @@ public function testGetType() */ public function testGetTypes() { - $this->expectDeprecation('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor::getType()" instead.'); + $this->expectUserDeprecationMessage('Since symfony/property-info 7.3: The "Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor::getTypes()" method is deprecated, use "Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor::getType()" instead.'); parent::testGetTypes(); parent::testGetTypes(); diff --git a/src/Symfony/Component/Routing/Route.php b/src/Symfony/Component/Routing/Route.php index 1ed484f71237b..621a4239fcf7a 100644 --- a/src/Symfony/Component/Routing/Route.php +++ b/src/Symfony/Component/Routing/Route.php @@ -420,7 +420,7 @@ private function extractInlineDefaultsAndRequirements(string $pattern): string $pattern = preg_replace_callback('#\{(!?)([\w\x80-\xFF]++)(:([\w\x80-\xFF]++)(\.[\w\x80-\xFF]++)?)?(<.*?>)?(\?[^\}]*+)?\}#', function ($m) use (&$mapping) { if (isset($m[7][0])) { - $this->setDefault($m[2], '?' !== $m[6] ? substr($m[7], 1) : null); + $this->setDefault($m[2], '?' !== $m[7] ? substr($m[7], 1) : null); } if (isset($m[6][0])) { $this->setRequirement($m[2], substr($m[6], 1, -1)); diff --git a/src/Symfony/Component/Routing/Tests/RouteTest.php b/src/Symfony/Component/Routing/Tests/RouteTest.php index b58358a3ef31b..3472804249f57 100644 --- a/src/Symfony/Component/Routing/Tests/RouteTest.php +++ b/src/Symfony/Component/Routing/Tests/RouteTest.php @@ -226,37 +226,48 @@ public function testSerialize() $this->assertNotSame($route, $unserialized); } - public function testInlineDefaultAndRequirement() + /** + * @dataProvider provideInlineDefaultAndRequirementCases + */ + public function testInlineDefaultAndRequirement(Route $route, string $expectedPath, string $expectedHost, array $expectedDefaults, array $expectedRequirements) + { + self::assertSame($expectedPath, $route->getPath()); + self::assertSame($expectedHost, $route->getHost()); + self::assertSame($expectedDefaults, $route->getDefaults()); + self::assertSame($expectedRequirements, $route->getRequirements()); + } + + public static function provideInlineDefaultAndRequirementCases(): iterable { - $this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', null), new Route('/foo/{bar?}')); - $this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', 'baz'), new Route('/foo/{bar?baz}')); - $this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', 'baz'), new Route('/foo/{bar?baz}')); - $this->assertEquals((new Route('/foo/{!bar}'))->setDefault('bar', 'baz'), new Route('/foo/{!bar?baz}')); - $this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', 'baz'), new Route('/foo/{bar?}', ['bar' => 'baz'])); - - $this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '.*'), new Route('/foo/{bar<.*>}')); - $this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '>'), new Route('/foo/{bar<>>}')); - $this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '\d+'), new Route('/foo/{bar<.*>}', [], ['bar' => '\d+'])); - $this->assertEquals((new Route('/foo/{bar}'))->setRequirement('bar', '[a-z]{2}'), new Route('/foo/{bar<[a-z]{2}>}')); - $this->assertEquals((new Route('/foo/{!bar}'))->setRequirement('bar', '\d+'), new Route('/foo/{!bar<\d+>}')); - - $this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', null)->setRequirement('bar', '.*'), new Route('/foo/{bar<.*>?}')); - $this->assertEquals((new Route('/foo/{bar}'))->setDefault('bar', '<>')->setRequirement('bar', '>'), new Route('/foo/{bar<>>?<>}')); - - $this->assertEquals((new Route('/{foo}/{!bar}'))->setDefaults(['bar' => '<>', 'foo' => '\\'])->setRequirements(['bar' => '\\', 'foo' => '.']), new Route('/{foo<.>?\}/{!bar<\>?<>}')); - - $this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', null), (new Route('/'))->setHost('{bar?}')); - $this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', 'baz'), (new Route('/'))->setHost('{bar?baz}')); - $this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', 'baz'), (new Route('/'))->setHost('{bar?baz}')); - $this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', null), (new Route('/', ['bar' => 'baz']))->setHost('{bar?}')); - - $this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '.*'), (new Route('/'))->setHost('{bar<.*>}')); - $this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '>'), (new Route('/'))->setHost('{bar<>>}')); - $this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '.*'), (new Route('/', [], ['bar' => '\d+']))->setHost('{bar<.*>}')); - $this->assertEquals((new Route('/'))->setHost('{bar}')->setRequirement('bar', '[a-z]{2}'), (new Route('/'))->setHost('{bar<[a-z]{2}>}')); - - $this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', null)->setRequirement('bar', '.*'), (new Route('/'))->setHost('{bar<.*>?}')); - $this->assertEquals((new Route('/'))->setHost('{bar}')->setDefault('bar', '<>')->setRequirement('bar', '>'), (new Route('/'))->setHost('{bar<>>?<>}')); + yield [new Route('/foo/{bar?}'), '/foo/{bar}', '', ['bar' => null], []]; + yield [new Route('/foo/{bar?baz}'), '/foo/{bar}', '', ['bar' => 'baz'], []]; + yield [new Route('/foo/{bar?baz}'), '/foo/{bar}', '', ['bar' => 'baz'], []]; + yield [new Route('/foo/{!bar?baz}'), '/foo/{!bar}', '', ['bar' => 'baz'], []]; + yield [new Route('/foo/{bar?}', ['bar' => 'baz']), '/foo/{bar}', '', ['bar' => 'baz'], []]; + + yield [new Route('/foo/{bar<.*>}'), '/foo/{bar}', '', [], ['bar' => '.*']]; + yield [new Route('/foo/{bar<>>}'), '/foo/{bar}', '', [], ['bar' => '>']]; + yield [new Route('/foo/{bar<.*>}', [], ['bar' => '\d+']), '/foo/{bar}', '', [], ['bar' => '\d+']]; + yield [new Route('/foo/{bar<[a-z]{2}>}'), '/foo/{bar}', '', [], ['bar' => '[a-z]{2}']]; + yield [new Route('/foo/{!bar<\d+>}'), '/foo/{!bar}', '', [], ['bar' => '\d+']]; + + yield [new Route('/foo/{bar<.*>?}'), '/foo/{bar}', '', ['bar' => null], ['bar' => '.*']]; + yield [new Route('/foo/{bar<>>?<>}'), '/foo/{bar}', '', ['bar' => '<>'], ['bar' => '>']]; + + yield [new Route('/{foo<.>?\}/{!bar<\>?<>}'), '/{foo}/{!bar}', '', ['foo' => '\\', 'bar' => '<>'], ['foo' => '.', 'bar' => '\\']]; + + yield [new Route('/', host: '{bar?}'), '/', '{bar}', ['bar' => null], []]; + yield [new Route('/', host: '{bar?baz}'), '/', '{bar}', ['bar' => 'baz'], []]; + yield [new Route('/', host: '{bar?baz}'), '/', '{bar}', ['bar' => 'baz'], []]; + yield [new Route('/', ['bar' => 'baz'], host: '{bar?}'), '/', '{bar}', ['bar' => null], []]; + + yield [new Route('/', host: '{bar<.*>}'), '/', '{bar}', [], ['bar' => '.*']]; + yield [new Route('/', host: '{bar<>>}'), '/', '{bar}', [], ['bar' => '>']]; + yield [new Route('/', [], ['bar' => '\d+'], host: '{bar<.*>}'), '/', '{bar}', [], ['bar' => '.*']]; + yield [new Route('/', host: '{bar<[a-z]{2}>}'), '/', '{bar}', [], ['bar' => '[a-z]{2}']]; + + yield [new Route('/', host: '{bar<.*>?}'), '/', '{bar}', ['bar' => null], ['bar' => '.*']]; + yield [new Route('/', host: '{bar<>>?<>}'), '/', '{bar}', ['bar' => '<>'], ['bar' => '>']]; } /** diff --git a/src/Symfony/Component/Runtime/Internal/BasicErrorHandler.php b/src/Symfony/Component/Runtime/Internal/BasicErrorHandler.php index a252814570f2e..c0c290e686800 100644 --- a/src/Symfony/Component/Runtime/Internal/BasicErrorHandler.php +++ b/src/Symfony/Component/Runtime/Internal/BasicErrorHandler.php @@ -20,7 +20,7 @@ class BasicErrorHandler { public static function register(bool $debug): void { - error_reporting(-1); + error_reporting(\E_ALL & ~\E_DEPRECATED & ~\E_USER_DEPRECATED); if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { ini_set('display_errors', $debug); diff --git a/src/Symfony/Component/Runtime/Internal/SymfonyErrorHandler.php b/src/Symfony/Component/Runtime/Internal/SymfonyErrorHandler.php index 0dfc7de0ca7a0..47c67605b0430 100644 --- a/src/Symfony/Component/Runtime/Internal/SymfonyErrorHandler.php +++ b/src/Symfony/Component/Runtime/Internal/SymfonyErrorHandler.php @@ -30,7 +30,7 @@ public static function register(bool $debug): void return; } - error_reporting(-1); + error_reporting(\E_ALL & ~\E_DEPRECATED & ~\E_USER_DEPRECATED); if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { ini_set('display_errors', $debug); diff --git a/src/Symfony/Component/Runtime/SymfonyRuntime.php b/src/Symfony/Component/Runtime/SymfonyRuntime.php index c66035f9abaf0..4667bbdfba24f 100644 --- a/src/Symfony/Component/Runtime/SymfonyRuntime.php +++ b/src/Symfony/Component/Runtime/SymfonyRuntime.php @@ -41,6 +41,7 @@ class_exists(MissingDotenv::class, false) || class_exists(Dotenv::class) || clas * - "test_envs" to define the names of the test envs - defaults to ["test"]; * - "use_putenv" to tell Dotenv to set env vars using putenv() (NOT RECOMMENDED.) * - "dotenv_overload" to tell Dotenv to override existing vars + * - "dotenv_extra_paths" to define a list of additional dot-env files * * When the "debug" / "env" options are not defined, they will fallback to the * "APP_DEBUG" / "APP_ENV" environment variables, and to the "--env|-e" / "--no-debug" @@ -86,6 +87,7 @@ class SymfonyRuntime extends GenericRuntime * env_var_name?: string, * debug_var_name?: string, * dotenv_overload?: ?bool, + * dotenv_extra_paths?: ?string[], * } $options */ public function __construct(array $options = []) @@ -107,12 +109,22 @@ public function __construct(array $options = []) } if (!($options['disable_dotenv'] ?? false) && isset($options['project_dir']) && !class_exists(MissingDotenv::class, false)) { - (new Dotenv($envKey, $debugKey)) + $overrideExistingVars = $options['dotenv_overload'] ?? false; + $dotenv = (new Dotenv($envKey, $debugKey)) ->setProdEnvs((array) ($options['prod_envs'] ?? ['prod'])) - ->usePutenv($options['use_putenv'] ?? false) - ->bootEnv($options['project_dir'].'/'.($options['dotenv_path'] ?? '.env'), 'dev', (array) ($options['test_envs'] ?? ['test']), $options['dotenv_overload'] ?? false); + ->usePutenv($options['use_putenv'] ?? false); - if (isset($this->input) && ($options['dotenv_overload'] ?? false)) { + $dotenv->bootEnv($options['project_dir'].'/'.($options['dotenv_path'] ?? '.env'), 'dev', (array) ($options['test_envs'] ?? ['test']), $overrideExistingVars); + + if (\is_array($options['dotenv_extra_paths'] ?? null) && $options['dotenv_extra_paths']) { + $options['dotenv_extra_paths'] = array_map(fn (string $path) => $options['project_dir'].'/'.$path, $options['dotenv_extra_paths']); + + $overrideExistingVars + ? $dotenv->overload(...$options['dotenv_extra_paths']) + : $dotenv->load(...$options['dotenv_extra_paths']); + } + + if (isset($this->input) && $overrideExistingVars) { if ($this->input->getParameterOption(['--env', '-e'], $_SERVER[$envKey], true) !== $_SERVER[$envKey]) { throw new \LogicException(\sprintf('Cannot use "--env" or "-e" when the "%s" file defines "%s" and the "dotenv_overload" runtime option is true.', $options['dotenv_path'] ?? '.env', $envKey)); } @@ -150,7 +162,11 @@ public function getRunner(?object $application): RunnerInterface if (!$application->getName() || !$console->has($application->getName())) { $application->setName($_SERVER['argv'][0]); - $console->add($application); + if (method_exists($console, 'addCommand')) { + $console->addCommand($application); + } else { + $console->add($application); + } } $console->setDefaultCommand($application->getName(), true); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/.env.extra b/src/Symfony/Component/Runtime/Tests/phpt/.env.extra new file mode 100644 index 0000000000000..0e7e46afbc754 --- /dev/null +++ b/src/Symfony/Component/Runtime/Tests/phpt/.env.extra @@ -0,0 +1 @@ +SOME_VAR=foo_bar_extra diff --git a/src/Symfony/Component/Runtime/Tests/phpt/application.php b/src/Symfony/Component/Runtime/Tests/phpt/application.php index ca2de555edfb7..b51947c2afaf1 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/application.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/application.php @@ -25,7 +25,11 @@ }); $app = new Application(); - $app->add($command); + if (method_exists($app, 'addCommand')) { + $app->addCommand($command); + } else { + $app->add($command); + } $app->setDefaultCommand('go', true); return $app; diff --git a/src/Symfony/Component/Runtime/Tests/phpt/command_list.php b/src/Symfony/Component/Runtime/Tests/phpt/command_list.php index 929b4401e86b9..aa40eda627151 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/command_list.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/command_list.php @@ -23,7 +23,11 @@ $command->setName('my_command'); [$cmd, $args] = $runtime->getResolver(require __DIR__.'/command.php')->resolve(); - $app->add($cmd(...$args)); + if (method_exists($app, 'addCommand')) { + $app->addCommand($cmd(...$args)); + } else { + $app->add($cmd(...$args)); + } return $app; }; diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_load.php b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_load.php new file mode 100644 index 0000000000000..35644998b02d5 --- /dev/null +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_load.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +$_SERVER['SOME_VAR'] = 'ccc'; +$_SERVER['APP_RUNTIME_OPTIONS'] = [ + 'dotenv_extra_paths' => [ + '.env.extra', + ], + 'dotenv_overload' => false, +]; + +require __DIR__.'/autoload.php'; + +return fn (Request $request, array $context) => new Response('OK Request '.$context['SOME_VAR']); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_load.phpt b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_load.phpt new file mode 100644 index 0000000000000..89da5c24cd085 --- /dev/null +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_load.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Dotenv extra paths load +--INI-- +display_errors=1 +--FILE-- + +--EXPECTF-- +OK Request ccc diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_overload.php b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_overload.php new file mode 100644 index 0000000000000..e834257248284 --- /dev/null +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_overload.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +$_SERVER['SOME_VAR'] = 'ccc'; +$_SERVER['APP_RUNTIME_OPTIONS'] = [ + 'dotenv_extra_paths' => [ + '.env.extra', + ], + 'dotenv_overload' => true, +]; + +require __DIR__.'/autoload.php'; + +return fn (Request $request, array $context) => new Response('OK Request '.$context['SOME_VAR']); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_overload.phpt b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_overload.phpt new file mode 100644 index 0000000000000..88fa4c541280b --- /dev/null +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_extra_overload.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Dotenv extra paths overload +--INI-- +display_errors=1 +--FILE-- + +--EXPECTF-- +OK Request foo_bar_extra diff --git a/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php b/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php index b2e18a29efe51..683e46d4e0eb8 100644 --- a/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php +++ b/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php @@ -32,16 +32,12 @@ abstract class AbstractToken implements TokenInterface, \Serializable */ public function __construct(array $roles = []) { - $this->roleNames = []; - - foreach ($roles as $role) { - $this->roleNames[] = (string) $role; - } + $this->roleNames = $roles; } public function getRoleNames(): array { - return $this->roleNames ??= self::__construct($this->user->getRoles()) ?? $this->roleNames; + return $this->roleNames ??= $this->user?->getRoles() ?? []; } public function getUserIdentifier(): string @@ -90,13 +86,7 @@ public function eraseCredentials(): void */ public function __serialize(): array { - $data = [$this->user, true, null, $this->attributes]; - - if (!$this->user instanceof EquatableInterface) { - $data[] = $this->roleNames; - } - - return $data; + return [$this->user, true, null, $this->attributes, $this->getRoleNames()]; } /** @@ -160,12 +150,7 @@ public function __toString(): string $class = static::class; $class = substr($class, strrpos($class, '\\') + 1); - $roles = []; - foreach ($this->roleNames as $role) { - $roles[] = $role; - } - - return \sprintf('%s(user="%s", roles="%s")', $class, $this->getUserIdentifier(), implode(', ', $roles)); + return \sprintf('%s(user="%s", roles="%s")', $class, $this->getUserIdentifier(), implode(', ', $this->getRoleNames())); } /** diff --git a/src/Symfony/Component/Security/Core/Authorization/TraceableAccessDecisionManager.php b/src/Symfony/Component/Security/Core/Authorization/TraceableAccessDecisionManager.php index a03e2d0ca749b..0ef062f6cc37d 100644 --- a/src/Symfony/Component/Security/Core/Authorization/TraceableAccessDecisionManager.php +++ b/src/Symfony/Component/Security/Core/Authorization/TraceableAccessDecisionManager.php @@ -54,7 +54,7 @@ public function decide(TokenInterface $token, array $attributes, mixed $object = $this->accessDecisionStack[] = $accessDecision; try { - return $accessDecision->isGranted = $this->manager->decide($token, $attributes, $object, $accessDecision); + return $accessDecision->isGranted = $this->manager->decide($token, $attributes, $object, $accessDecision, $allowMultipleAttributes); } finally { $this->strategy = $accessDecision->strategy; $currentLog = array_pop($this->currentLog); diff --git a/src/Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php b/src/Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php index 1403aaaaf0b15..3ab6b92c1d956 100644 --- a/src/Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php +++ b/src/Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php @@ -45,11 +45,10 @@ public function __construct( */ public function vote(TokenInterface $token, mixed $subject, array $attributes/* , ?Vote $vote = null */): int { - $vote = 3 < \func_num_args() ? func_get_arg(3) : new Vote(); - $vote ??= new Vote(); + $vote = 3 < \func_num_args() ? func_get_arg(3) : null; if ($attributes === [self::PUBLIC_ACCESS]) { - $vote->reasons[] = 'Access is public.'; + $vote?->addReason('Access is public.'); return VoterInterface::ACCESS_GRANTED; } @@ -73,7 +72,7 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes/* if ((self::IS_AUTHENTICATED_FULLY === $attribute || self::IS_AUTHENTICATED_REMEMBERED === $attribute) && $this->authenticationTrustResolver->isFullFledged($token) ) { - $vote->reasons[] = 'The user is fully authenticated.'; + $vote?->addReason('The user is fully authenticated.'); return VoterInterface::ACCESS_GRANTED; } @@ -81,32 +80,32 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes/* if (self::IS_AUTHENTICATED_REMEMBERED === $attribute && $this->authenticationTrustResolver->isRememberMe($token) ) { - $vote->reasons[] = 'The user is remembered.'; + $vote?->addReason('The user is remembered.'); return VoterInterface::ACCESS_GRANTED; } if (self::IS_AUTHENTICATED === $attribute && $this->authenticationTrustResolver->isAuthenticated($token)) { - $vote->reasons[] = 'The user is authenticated.'; + $vote?->addReason('The user is authenticated.'); return VoterInterface::ACCESS_GRANTED; } if (self::IS_REMEMBERED === $attribute && $this->authenticationTrustResolver->isRememberMe($token)) { - $vote->reasons[] = 'The user is remembered.'; + $vote?->addReason('The user is remembered.'); return VoterInterface::ACCESS_GRANTED; } if (self::IS_IMPERSONATOR === $attribute && $token instanceof SwitchUserToken) { - $vote->reasons[] = 'The user is impersonating another user.'; + $vote?->addReason('The user is impersonating another user.'); return VoterInterface::ACCESS_GRANTED; } } if (VoterInterface::ACCESS_DENIED === $result) { - $vote->reasons[] = 'The user is not appropriately authenticated.'; + $vote?->addReason('The user is not appropriately authenticated.'); } return $result; diff --git a/src/Symfony/Component/Security/Core/Authorization/Voter/ClosureVoter.php b/src/Symfony/Component/Security/Core/Authorization/Voter/ClosureVoter.php index 03a9f7571a571..4fb5502fd91c5 100644 --- a/src/Symfony/Component/Security/Core/Authorization/Voter/ClosureVoter.php +++ b/src/Symfony/Component/Security/Core/Authorization/Voter/ClosureVoter.php @@ -42,7 +42,6 @@ public function supportsType(string $subjectType): bool public function vote(TokenInterface $token, mixed $subject, array $attributes, ?Vote $vote = null): int { - $vote ??= new Vote(); $context = new IsGrantedContext($token, $token->getUser(), $this->authorizationChecker); $failingClosures = []; $result = VoterInterface::ACCESS_ABSTAIN; @@ -54,7 +53,7 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes, ? $name = (new \ReflectionFunction($attribute))->name; $result = VoterInterface::ACCESS_DENIED; if ($attribute($context, $subject)) { - $vote->reasons[] = \sprintf('Closure %s returned true.', $name); + $vote?->addReason(\sprintf('Closure %s returned true.', $name)); return VoterInterface::ACCESS_GRANTED; } @@ -63,7 +62,7 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes, ? } if ($failingClosures) { - $vote->reasons[] = \sprintf('Closure%s %s returned false.', 1 < \count($failingClosures) ? 's' : '', implode(', ', $failingClosures)); + $vote?->addReason(\sprintf('Closure%s %s returned false.', 1 < \count($failingClosures) ? 's' : '', implode(', ', $failingClosures))); } return $result; diff --git a/src/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php b/src/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php index 35d727a8eb15e..719aae7d46872 100644 --- a/src/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php +++ b/src/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php @@ -49,8 +49,7 @@ public function supportsType(string $subjectType): bool */ public function vote(TokenInterface $token, mixed $subject, array $attributes/* , ?Vote $vote = null */): int { - $vote = 3 < \func_num_args() ? func_get_arg(3) : new Vote(); - $vote ??= new Vote(); + $vote = 3 < \func_num_args() ? func_get_arg(3) : null; $result = VoterInterface::ACCESS_ABSTAIN; $variables = null; $failingExpressions = []; @@ -64,7 +63,7 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes/* $result = VoterInterface::ACCESS_DENIED; if ($this->expressionLanguage->evaluate($attribute, $variables)) { - $vote->reasons[] = \sprintf('Expression (%s) is true.', $attribute); + $vote?->addReason(\sprintf('Expression (%s) is true.', $attribute)); return VoterInterface::ACCESS_GRANTED; } @@ -73,7 +72,7 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes/* } if ($failingExpressions) { - $vote->reasons[] = \sprintf('Expression (%s) is false.', implode(') || (', $failingExpressions)); + $vote?->addReason(\sprintf('Expression (%s) is false.', implode(') || (', $failingExpressions))); } return $result; diff --git a/src/Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php b/src/Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php index 46c08d15b48ed..2225e8d4d4c41 100644 --- a/src/Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php +++ b/src/Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php @@ -30,8 +30,7 @@ public function __construct( */ public function vote(TokenInterface $token, mixed $subject, array $attributes/* , ?Vote $vote = null */): int { - $vote = 3 < \func_num_args() ? func_get_arg(3) : new Vote(); - $vote ??= new Vote(); + $vote = 3 < \func_num_args() ? func_get_arg(3) : null; $result = VoterInterface::ACCESS_ABSTAIN; $roles = $this->extractRoles($token); $missingRoles = []; @@ -44,7 +43,7 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes/* $result = VoterInterface::ACCESS_DENIED; if (\in_array($attribute, $roles, true)) { - $vote->reasons[] = \sprintf('The user has %s.', $attribute); + $vote?->addReason(\sprintf('The user has %s.', $attribute)); return VoterInterface::ACCESS_GRANTED; } @@ -53,7 +52,7 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes/* } if (VoterInterface::ACCESS_DENIED === $result) { - $vote->reasons[] = \sprintf('The user doesn\'t have%s %s.', 1 < \count($missingRoles) ? ' any of' : '', implode(', ', $missingRoles)); + $vote?->addReason(\sprintf('The user doesn\'t have%s %s.', 1 < \count($missingRoles) ? ' any of' : '', implode(', ', $missingRoles))); } return $result; diff --git a/src/Symfony/Component/Security/Core/Authorization/Voter/TraceableVoter.php b/src/Symfony/Component/Security/Core/Authorization/Voter/TraceableVoter.php index 47572797ee906..ec92606359859 100644 --- a/src/Symfony/Component/Security/Core/Authorization/Voter/TraceableVoter.php +++ b/src/Symfony/Component/Security/Core/Authorization/Voter/TraceableVoter.php @@ -32,9 +32,9 @@ public function __construct( public function vote(TokenInterface $token, mixed $subject, array $attributes, ?Vote $vote = null): int { - $result = $this->voter->vote($token, $subject, $attributes, $vote ??= new Vote()); + $result = $this->voter->vote($token, $subject, $attributes, $vote); - $this->eventDispatcher->dispatch(new VoteEvent($this->voter, $subject, $attributes, $result, $vote->reasons), 'debug.security.authorization.vote'); + $this->eventDispatcher->dispatch(new VoteEvent($this->voter, $subject, $attributes, $result, $vote->reasons ?? []), 'debug.security.authorization.vote'); return $result; } diff --git a/src/Symfony/Component/Security/Core/Authorization/Voter/Voter.php b/src/Symfony/Component/Security/Core/Authorization/Voter/Voter.php index 3d7fd9e2d7a1f..55930def8fda9 100644 --- a/src/Symfony/Component/Security/Core/Authorization/Voter/Voter.php +++ b/src/Symfony/Component/Security/Core/Authorization/Voter/Voter.php @@ -29,10 +29,9 @@ abstract class Voter implements VoterInterface, CacheableVoterInterface */ public function vote(TokenInterface $token, mixed $subject, array $attributes/* , ?Vote $vote = null */): int { - $vote = 3 < \func_num_args() ? func_get_arg(3) : new Vote(); - $vote ??= new Vote(); + $vote = 3 < \func_num_args() ? func_get_arg(3) : null; // abstain vote by default in case none of the attributes are supported - $vote->result = self::ACCESS_ABSTAIN; + $voteResult = self::ACCESS_ABSTAIN; foreach ($attributes as $attribute) { try { @@ -48,15 +47,27 @@ public function vote(TokenInterface $token, mixed $subject, array $attributes/* } // as soon as at least one attribute is supported, default is to deny access - $vote->result = self::ACCESS_DENIED; + $voteResult = self::ACCESS_DENIED; + + if (null !== $vote) { + $vote->result = $voteResult; + } if ($this->voteOnAttribute($attribute, $subject, $token, $vote)) { // grant access as soon as at least one attribute returns a positive response - return $vote->result = self::ACCESS_GRANTED; + if (null !== $vote) { + $vote->result = self::ACCESS_GRANTED; + } + + return self::ACCESS_GRANTED; } } - return $vote->result; + if (null !== $vote) { + $vote->result = $voteResult; + } + + return $voteResult; } /** 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.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/Tests/Authentication/Token/AbstractTokenTest.php b/src/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php index ef3d380c16be4..3972b1cde073b 100644 --- a/src/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php +++ b/src/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php @@ -12,7 +12,7 @@ namespace Symfony\Component\Security\Core\Tests\Authentication\Token; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\Security\Core\Authentication\Token\AbstractToken; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\User\InMemoryUser; @@ -20,7 +20,7 @@ class AbstractTokenTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; /** * @dataProvider provideUsers @@ -48,7 +48,7 @@ public function testEraseCredentials() $user->expects($this->once())->method('eraseCredentials'); $token->setUser($user); - $this->expectDeprecation(\sprintf('Since symfony/security-core 7.3: The "%s::eraseCredentials()" method is deprecated and will be removed in 8.0, erase credentials using the "__serialize()" method instead.', TokenInterface::class)); + $this->expectUserDeprecationMessage(\sprintf('Since symfony/security-core 7.3: The "%s::eraseCredentials()" method is deprecated and will be removed in 8.0, erase credentials using the "__serialize()" method instead.', TokenInterface::class)); $token->eraseCredentials(); } diff --git a/src/Symfony/Component/Security/Core/Tests/Authorization/TraceableAccessDecisionManagerTest.php b/src/Symfony/Component/Security/Core/Tests/Authorization/TraceableAccessDecisionManagerTest.php index f5313bb541c22..496d970cd1f00 100644 --- a/src/Symfony/Component/Security/Core/Tests/Authorization/TraceableAccessDecisionManagerTest.php +++ b/src/Symfony/Component/Security/Core/Tests/Authorization/TraceableAccessDecisionManagerTest.php @@ -11,12 +11,14 @@ namespace Symfony\Component\Security\Core\Tests\Authorization; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authorization\AccessDecisionManager; use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface; use Symfony\Component\Security\Core\Authorization\TraceableAccessDecisionManager; use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; +use Symfony\Component\Security\Core\Exception\InvalidArgumentException; use Symfony\Component\Security\Core\Tests\Fixtures\DummyVoter; class TraceableAccessDecisionManagerTest extends TestCase @@ -276,4 +278,48 @@ public function testCustomAccessDecisionManagerReturnsEmptyStrategy() $this->assertEquals('-', $adm->getStrategy()); } + + public function testThrowsExceptionWhenMultipleAttributesNotAllowed() + { + $accessDecisionManager = new AccessDecisionManager(); + $traceableAccessDecisionManager = new TraceableAccessDecisionManager($accessDecisionManager); + /** @var TokenInterface&MockObject $tokenMock */ + $tokenMock = $this->createMock(TokenInterface::class); + + $this->expectException(InvalidArgumentException::class); + $traceableAccessDecisionManager->decide($tokenMock, ['attr1', 'attr2']); + } + + /** + * @dataProvider allowMultipleAttributesProvider + */ + public function testAllowMultipleAttributes(array $attributes, bool $allowMultipleAttributes) + { + $accessDecisionManager = new AccessDecisionManager(); + $traceableAccessDecisionManager = new TraceableAccessDecisionManager($accessDecisionManager); + /** @var TokenInterface&MockObject $tokenMock */ + $tokenMock = $this->createMock(TokenInterface::class); + + $isGranted = $traceableAccessDecisionManager->decide($tokenMock, $attributes, null, null, $allowMultipleAttributes); + + $this->assertFalse($isGranted); + } + + public static function allowMultipleAttributesProvider(): \Generator + { + yield [ + ['attr1'], + false, + ]; + + yield [ + ['attr1'], + true, + ]; + + yield [ + ['attr1', 'attr2', 'attr3'], + true, + ]; + } } diff --git a/src/Symfony/Component/Security/Core/Tests/Authorization/Voter/VoterTest.php b/src/Symfony/Component/Security/Core/Tests/Authorization/Voter/VoterTest.php index a8f87e09da7e6..eaada3061dbfe 100644 --- a/src/Symfony/Component/Security/Core/Tests/Authorization/Voter/VoterTest.php +++ b/src/Symfony/Component/Security/Core/Tests/Authorization/Voter/VoterTest.php @@ -33,35 +33,51 @@ public static function getTests(): array return [ [$voter, ['EDIT'], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if attribute and class are supported and attribute grants access'], + [$voter, ['EDIT'], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if attribute and class are supported and attribute grants access', new Vote()], [$voter, ['CREATE'], VoterInterface::ACCESS_DENIED, new \stdClass(), 'ACCESS_DENIED if attribute and class are supported and attribute does not grant access'], + [$voter, ['CREATE'], VoterInterface::ACCESS_DENIED, new \stdClass(), 'ACCESS_DENIED if attribute and class are supported and attribute does not grant access', new Vote()], [$voter, ['DELETE', 'EDIT'], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if one attribute is supported and grants access'], + [$voter, ['DELETE', 'EDIT'], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if one attribute is supported and grants access', new Vote()], [$voter, ['DELETE', 'CREATE'], VoterInterface::ACCESS_DENIED, new \stdClass(), 'ACCESS_DENIED if one attribute is supported and denies access'], + [$voter, ['DELETE', 'CREATE'], VoterInterface::ACCESS_DENIED, new \stdClass(), 'ACCESS_DENIED if one attribute is supported and denies access', new Vote()], [$voter, ['CREATE', 'EDIT'], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if one attribute grants access'], + [$voter, ['CREATE', 'EDIT'], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if one attribute grants access', new Vote()], [$voter, ['DELETE'], VoterInterface::ACCESS_ABSTAIN, new \stdClass(), 'ACCESS_ABSTAIN if no attribute is supported'], + [$voter, ['DELETE'], VoterInterface::ACCESS_ABSTAIN, new \stdClass(), 'ACCESS_ABSTAIN if no attribute is supported', new Vote()], [$voter, ['EDIT'], VoterInterface::ACCESS_ABSTAIN, new class {}, 'ACCESS_ABSTAIN if class is not supported'], + [$voter, ['EDIT'], VoterInterface::ACCESS_ABSTAIN, new class {}, 'ACCESS_ABSTAIN if class is not supported', new Vote()], [$voter, ['EDIT'], VoterInterface::ACCESS_ABSTAIN, null, 'ACCESS_ABSTAIN if object is null'], + [$voter, ['EDIT'], VoterInterface::ACCESS_ABSTAIN, null, 'ACCESS_ABSTAIN if object is null', new Vote()], [$voter, [], VoterInterface::ACCESS_ABSTAIN, new \stdClass(), 'ACCESS_ABSTAIN if no attributes were provided'], + [$voter, [], VoterInterface::ACCESS_ABSTAIN, new \stdClass(), 'ACCESS_ABSTAIN if no attributes were provided', new Vote()], [$voter, [new StringableAttribute()], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if attribute and class are supported and attribute grants access'], + [$voter, [new StringableAttribute()], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if attribute and class are supported and attribute grants access', new Vote()], [$voter, [new \stdClass()], VoterInterface::ACCESS_ABSTAIN, new \stdClass(), 'ACCESS_ABSTAIN if attributes were not strings'], + [$voter, [new \stdClass()], VoterInterface::ACCESS_ABSTAIN, new \stdClass(), 'ACCESS_ABSTAIN if attributes were not strings', new Vote()], [$integerVoter, [42], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if attribute is an integer'], + [$integerVoter, [42], VoterInterface::ACCESS_GRANTED, new \stdClass(), 'ACCESS_GRANTED if attribute is an integer', new Vote()], ]; } /** * @dataProvider getTests */ - public function testVote(VoterInterface $voter, array $attributes, $expectedVote, $object, $message) + public function testVote(VoterInterface $voter, array $attributes, $expectedVote, $object, $message, ?Vote $vote = null) { - $this->assertEquals($expectedVote, $voter->vote($this->token, $object, $attributes), $message); + $this->assertSame($expectedVote, $voter->vote($this->token, $object, $attributes, $vote), $message); + + if (null !== $vote) { + self::assertSame($expectedVote, $vote->result); + } } public function testVoteWithTypeError() diff --git a/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php b/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php index 501bf74283f8d..f06e98c32c80f 100644 --- a/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php +++ b/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php @@ -12,13 +12,13 @@ namespace Symfony\Component\Security\Core\Tests\User; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\Security\Core\User\InMemoryUser; use Symfony\Component\Security\Core\User\UserInterface; class InMemoryUserTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; public function testConstructorException() { @@ -62,7 +62,7 @@ public function testIsEnabled() public function testEraseCredentials() { $user = new InMemoryUser('fabien', 'superpass'); - $this->expectDeprecation(\sprintf('%sMethod %s::eraseCredentials() is deprecated since symfony/security-core 7.3', \PHP_VERSION_ID >= 80400 ? 'Unsilenced deprecation: ' : '', InMemoryUser::class)); + $this->expectUserDeprecationMessage(\sprintf('%sMethod %s::eraseCredentials() is deprecated since symfony/security-core 7.3', \PHP_VERSION_ID >= 80400 ? 'Unsilenced deprecation: ' : '', InMemoryUser::class)); $user->eraseCredentials(); $this->assertEquals('superpass', $user->getPassword()); } diff --git a/src/Symfony/Component/Security/Core/User/UserInterface.php b/src/Symfony/Component/Security/Core/User/UserInterface.php index 120521211b326..24c0581f83cbd 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/Http/AccessToken/Oidc/OidcTokenHandler.php b/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php index 322b2a18c7fde..393ca96ca6591 100644 --- a/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php +++ b/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php @@ -143,7 +143,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 1593018bc1dc9..004063322314e 100644 --- a/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcUserInfoTokenHandler.php +++ b/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcUserInfoTokenHandler.php @@ -76,7 +76,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/Attribute/IsGrantedContext.php b/src/Symfony/Component/Security/Http/Attribute/IsGrantedContext.php index fa2ce4a0f5ec8..87776452eec8c 100644 --- a/src/Symfony/Component/Security/Http/Attribute/IsGrantedContext.php +++ b/src/Symfony/Component/Security/Http/Attribute/IsGrantedContext.php @@ -17,12 +17,12 @@ use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter; use Symfony\Component\Security\Core\User\UserInterface; -readonly class IsGrantedContext implements AuthorizationCheckerInterface +class IsGrantedContext implements AuthorizationCheckerInterface { public function __construct( - public TokenInterface $token, - public ?UserInterface $user, - private AuthorizationCheckerInterface $authorizationChecker, + public readonly TokenInterface $token, + public readonly ?UserInterface $user, + private readonly AuthorizationCheckerInterface $authorizationChecker, ) { } diff --git a/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/CustomCredentials.php b/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/CustomCredentials.php index 4543e17492b2d..23ac8c7f662e6 100644 --- a/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/CustomCredentials.php +++ b/src/Symfony/Component/Security/Http/Authenticator/Passport/Credentials/CustomCredentials.php @@ -27,9 +27,9 @@ class CustomCredentials implements CredentialsInterface private bool $resolved = false; /** - * @param callable $customCredentialsChecker the check function. If this function does not return `true`, a - * BadCredentialsException is thrown. You may also throw a more - * specific exception in the function. + * @param callable(mixed, UserInterface) $customCredentialsChecker If the callable does not return `true`, a + * BadCredentialsException is thrown. You may + * also throw a more specific exception. */ public function __construct( callable $customCredentialsChecker, diff --git a/src/Symfony/Component/Security/Http/Firewall.php b/src/Symfony/Component/Security/Http/Firewall.php index 6c256dba60955..da616e86ccc99 100644 --- a/src/Symfony/Component/Security/Http/Firewall.php +++ b/src/Symfony/Component/Security/Http/Firewall.php @@ -122,7 +122,11 @@ public static function getSubscribedEvents() protected function callListeners(RequestEvent $event, iterable $listeners) { foreach ($listeners as $listener) { - $listener($event); + if (!$listener instanceof FirewallListenerInterface) { + $listener($event); + } elseif (false !== $listener->supports($event->getRequest())) { + $listener->authenticate($event); + } if ($event->hasResponse()) { break; 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/Authentication/AuthenticatorManagerTest.php b/src/Symfony/Component/Security/Http/Tests/Authentication/AuthenticatorManagerTest.php index a88b3ba5d3921..67f7247f14990 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authentication/AuthenticatorManagerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authentication/AuthenticatorManagerTest.php @@ -15,7 +15,7 @@ use PHPUnit\Framework\TestCase; use Psr\Log\AbstractLogger; use Psr\Log\LoggerInterface; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bridge\PhpUnit\ExpectUserDeprecationMessageTrait; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -42,7 +42,7 @@ class AuthenticatorManagerTest extends TestCase { - use ExpectDeprecationTrait; + use ExpectUserDeprecationMessageTrait; private MockObject&TokenStorageInterface $tokenStorage; private EventDispatcher $eventDispatcher; @@ -211,7 +211,7 @@ public function eraseCredentials(): void $authenticator->expects($this->any())->method('createToken')->willReturn($token); if ($eraseCredentials) { - $this->expectDeprecation(\sprintf('Since symfony/security-http 7.3: Implementing "%s@anonymous::eraseCredentials()" is deprecated since Symfony 7.3; add the #[\Deprecated] attribute on the method to signal its either empty or that you moved the logic elsewhere, typically to the "__serialize()" method.', AbstractToken::class)); + $this->expectUserDeprecationMessage(\sprintf('Since symfony/security-http 7.3: Implementing "%s@anonymous::eraseCredentials()" is deprecated since Symfony 7.3; add the #[\Deprecated] attribute on the method to signal its either empty or that you moved the logic elsewhere, typically to the "__serialize()" method.', AbstractToken::class)); } $manager = $this->createManager([$authenticator], 'main', $eraseCredentials, exposeSecurityErrors: ExposeSecurityLevel::None); 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/EventListener/IsGrantedAttributeListenerTest.php b/src/Symfony/Component/Security/Http/Tests/EventListener/IsGrantedAttributeListenerTest.php index 73494f405468c..d34b31f2bdeb8 100644 --- a/src/Symfony/Component/Security/Http/Tests/EventListener/IsGrantedAttributeListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/EventListener/IsGrantedAttributeListenerTest.php @@ -232,7 +232,7 @@ protected function supports(string $attribute, mixed $subject): bool protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token, ?Vote $vote = null): bool { - $vote->reasons[] = 'Because I can 😈.'; + $vote?->addReason('Because I can 😈.'); return false; } diff --git a/src/Symfony/Component/Security/Http/Tests/FirewallTest.php b/src/Symfony/Component/Security/Http/Tests/FirewallTest.php index f9417d237433c..89040f3875f2b 100644 --- a/src/Symfony/Component/Security/Http/Tests/FirewallTest.php +++ b/src/Symfony/Component/Security/Http/Tests/FirewallTest.php @@ -18,7 +18,9 @@ use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\Security\Http\Firewall; +use Symfony\Component\Security\Http\Firewall\AbstractListener; use Symfony\Component\Security\Http\Firewall\ExceptionListener; +use Symfony\Component\Security\Http\Firewall\FirewallListenerInterface; use Symfony\Component\Security\Http\FirewallMapInterface; class FirewallTest extends TestCase @@ -97,4 +99,59 @@ public function testOnKernelRequestWithSubRequest() $this->assertFalse($event->hasResponse()); } + + public function testListenersAreCalled() + { + $calledListeners = []; + + $callableListener = static function() use(&$calledListeners) { $calledListeners[] = 'callableListener'; }; + $firewallListener = new class($calledListeners) implements FirewallListenerInterface { + public function __construct(private array &$calledListeners) {} + + public function supports(Request $request): ?bool + { + return true; + } + + public function authenticate(RequestEvent $event): void + { + $this->calledListeners[] = 'firewallListener'; + } + + public static function getPriority(): int + { + return 0; + } + }; + $callableFirewallListener = new class($calledListeners) extends AbstractListener { + public function __construct(private array &$calledListeners) {} + + public function supports(Request $request): ?bool + { + return true; + } + + public function authenticate(RequestEvent $event): void + { + $this->calledListeners[] = 'callableFirewallListener'; + } + }; + + $request = $this->createMock(Request::class); + + $map = $this->createMock(FirewallMapInterface::class); + $map + ->expects($this->once()) + ->method('getListeners') + ->with($this->equalTo($request)) + ->willReturn([[$callableListener, $firewallListener, $callableFirewallListener], null, null]) + ; + + $event = new RequestEvent($this->createMock(HttpKernelInterface::class), $request, HttpKernelInterface::MAIN_REQUEST); + + $firewall = new Firewall($map, $this->createMock(EventDispatcherInterface::class)); + $firewall->onKernelRequest($event); + + $this->assertSame(['callableListener', 'firewallListener', 'callableFirewallListener'], $calledListeners); + } } diff --git a/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php index e48c6bd26722d..068323331181c 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/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/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/Normalizer/NumberNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/NumberNormalizerTest.php index 338f63ba5c296..56d4776b2227d 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/NumberNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/NumberNormalizerTest.php @@ -52,6 +52,7 @@ public static function supportsNormalizationProvider(): iterable } /** + * @requires PHP 8.4 * @requires extension bcmath * * @dataProvider normalizeGoodBcMathNumberValueProvider @@ -149,6 +150,8 @@ public static function denormalizeGoodBcMathNumberValueProvider(): iterable } /** + * @requires extension gmp + * * @dataProvider denormalizeGoodGmpValueProvider */ public function testDenormalizeGmp(string|int $data, string $type, \GMP $expected) diff --git a/src/Symfony/Component/String/AbstractUnicodeString.php b/src/Symfony/Component/String/AbstractUnicodeString.php index 979fcea895d68..cf280cdbac3c2 100644 --- a/src/Symfony/Component/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/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/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/composer.json b/src/Symfony/Component/Translation/composer.json index 1db1621590462..ce9a7bf48c61b 100644 --- a/src/Symfony/Component/Translation/composer.json +++ b/src/Symfony/Component/Translation/composer.json @@ -22,7 +22,7 @@ "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", @@ -37,6 +37,7 @@ "psr/log": "^1|^2|^3" }, "conflict": { + "nikic/php-parser": "<5.0", "symfony/config": "<6.4", "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", diff --git a/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithTypeAliases.php b/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithTypeAliases.php index 0b65137e4cdda..7f73190df1549 100644 --- a/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithTypeAliases.php +++ b/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithTypeAliases.php @@ -12,11 +12,15 @@ namespace Symfony\Component\TypeInfo\Tests\Fixtures; /** + * @phpstan-type CustomArray = array{0: CustomInt, 1: CustomString, 2: bool} * @phpstan-type CustomString = string + * * @phpstan-import-type CustomInt from DummyWithPhpDoc * @phpstan-import-type CustomInt from DummyWithPhpDoc as AliasedCustomInt * + * @psalm-type PsalmCustomArray = array{0: PsalmCustomInt, 1: PsalmCustomString, 2: bool} * @psalm-type PsalmCustomString = string + * * @psalm-import-type PsalmCustomInt from DummyWithPhpDoc * @psalm-import-type PsalmCustomInt from DummyWithPhpDoc as PsalmAliasedCustomInt */ @@ -53,9 +57,31 @@ final class DummyWithTypeAliases public mixed $psalmOtherAliasedExternalAlias; } +/** + * @phpstan-type Foo = array{0: Bar} + * @phpstan-type Bar = array{0: Foo} + */ +final class DummyWithRecursiveTypeAliases +{ +} + +/** + * @phpstan-type Invalid = SomethingInvalid + */ +final class DummyWithInvalidTypeAlias +{ +} + /** * @phpstan-import-type Invalid from DummyWithTypeAliases */ final class DummyWithInvalidTypeAliasImport { } + +/** + * @phpstan-import-type Invalid from int + */ +final class DummyWithTypeAliasImportedFromInvalidClassName +{ +} diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeContext/TypeContextFactoryTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeContext/TypeContextFactoryTest.php index e7794e4f114b6..7d6725ed26743 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeContext/TypeContextFactoryTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeContext/TypeContextFactoryTest.php @@ -15,9 +15,12 @@ use Symfony\Component\TypeInfo\Exception\LogicException; use Symfony\Component\TypeInfo\Tests\Fixtures\AbstractDummy; use Symfony\Component\TypeInfo\Tests\Fixtures\Dummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithInvalidTypeAlias; use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithInvalidTypeAliasImport; +use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithRecursiveTypeAliases; use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithTemplates; use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithTypeAliases; +use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithTypeAliasImportedFromInvalidClassName; use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithUses; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory; @@ -128,27 +131,33 @@ public function testCollectTypeAliases() $this->assertEquals([ 'CustomString' => Type::string(), 'CustomInt' => Type::int(), + 'CustomArray' => Type::arrayShape([0 => Type::int(), 1 => Type::string(), 2 => Type::bool()]), 'AliasedCustomInt' => Type::int(), 'PsalmCustomString' => Type::string(), 'PsalmCustomInt' => Type::int(), + 'PsalmCustomArray' => Type::arrayShape([0 => Type::int(), 1 => Type::string(), 2 => Type::bool()]), 'PsalmAliasedCustomInt' => Type::int(), ], $this->typeContextFactory->createFromClassName(DummyWithTypeAliases::class)->typeAliases); $this->assertEquals([ 'CustomString' => Type::string(), 'CustomInt' => Type::int(), + 'CustomArray' => Type::arrayShape([0 => Type::int(), 1 => Type::string(), 2 => Type::bool()]), 'AliasedCustomInt' => Type::int(), 'PsalmCustomString' => Type::string(), 'PsalmCustomInt' => Type::int(), + 'PsalmCustomArray' => Type::arrayShape([0 => Type::int(), 1 => Type::string(), 2 => Type::bool()]), 'PsalmAliasedCustomInt' => Type::int(), ], $this->typeContextFactory->createFromReflection(new \ReflectionClass(DummyWithTypeAliases::class))->typeAliases); $this->assertEquals([ 'CustomString' => Type::string(), 'CustomInt' => Type::int(), + 'CustomArray' => Type::arrayShape([0 => Type::int(), 1 => Type::string(), 2 => Type::bool()]), 'AliasedCustomInt' => Type::int(), 'PsalmCustomString' => Type::string(), 'PsalmCustomInt' => Type::int(), + 'PsalmCustomArray' => Type::arrayShape([0 => Type::int(), 1 => Type::string(), 2 => Type::bool()]), 'PsalmAliasedCustomInt' => Type::int(), ], $this->typeContextFactory->createFromReflection(new \ReflectionProperty(DummyWithTypeAliases::class, 'localAlias'))->typeAliases); } @@ -167,4 +176,28 @@ public function testThrowWhenImportingInvalidAlias() $this->typeContextFactory->createFromClassName(DummyWithInvalidTypeAliasImport::class); } + + public function testThrowWhenCannotResolveTypeAlias() + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Cannot resolve "Invalid" type alias.'); + + $this->typeContextFactory->createFromClassName(DummyWithInvalidTypeAlias::class); + } + + public function testThrowWhenTypeAliasNotImportedFromValidClassName() + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Type alias "Invalid" is not imported from a valid class name.'); + + $this->typeContextFactory->createFromClassName(DummyWithTypeAliasImportedFromInvalidClassName::class); + } + + public function testThrowWhenImportingRecursiveTypeAliases() + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Cannot resolve "Bar" type alias.'); + + $this->typeContextFactory->createFromClassName(DummyWithRecursiveTypeAliases::class)->typeAliases; + } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php index fcfe909cecf6e..9cdd9e1f196e9 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php @@ -79,6 +79,7 @@ public static function resolveDataProvider(): iterable yield [Type::arrayShape(['foo' => Type::bool()], sealed: false), 'array{foo: bool, ...}']; yield [Type::arrayShape(['foo' => Type::bool()], extraKeyType: Type::int(), extraValueType: Type::string()), 'array{foo: bool, ...}']; yield [Type::arrayShape(['foo' => Type::bool()], extraValueType: Type::int()), 'array{foo: bool, ...}']; + yield [Type::arrayShape(['foo' => Type::union(Type::bool(), Type::float(), Type::int(), Type::null(), Type::string()), 'bar' => Type::string()]), 'array{foo: scalar|null, bar: string}']; // object shape yield [Type::object(), 'object{foo: true, bar: false}']; @@ -157,6 +158,9 @@ 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']; @@ -216,9 +220,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/Type/CollectionType.php b/src/Symfony/Component/TypeInfo/Type/CollectionType.php index 80fbbdba6c3fa..a801f2b51f8d0 100644 --- a/src/Symfony/Component/TypeInfo/Type/CollectionType.php +++ b/src/Symfony/Component/TypeInfo/Type/CollectionType.php @@ -65,25 +65,27 @@ public static function mergeCollectionValueTypes(array $types): Type $boolTypes = []; $objectTypes = []; - foreach ($types as $t) { - // cannot create an union with a standalone type - if ($t->isIdentifiedBy(TypeIdentifier::MIXED)) { - return Type::mixed(); - } + foreach ($types as $type) { + foreach (($type instanceof UnionType ? $type->getTypes() : [$type]) as $t) { + // cannot create an union with a standalone type + if ($t->isIdentifiedBy(TypeIdentifier::MIXED)) { + return Type::mixed(); + } - if ($t->isIdentifiedBy(TypeIdentifier::TRUE, TypeIdentifier::FALSE, TypeIdentifier::BOOL)) { - $boolTypes[] = $t; + if ($t->isIdentifiedBy(TypeIdentifier::TRUE, TypeIdentifier::FALSE, TypeIdentifier::BOOL)) { + $boolTypes[] = $t; - continue; - } + continue; + } - if ($t->isIdentifiedBy(TypeIdentifier::OBJECT)) { - $objectTypes[] = $t; + if ($t->isIdentifiedBy(TypeIdentifier::OBJECT)) { + $objectTypes[] = $t; - continue; - } + continue; + } - $normalizedTypes[] = $t; + $normalizedTypes[] = $t; + } } $boolTypes = array_unique($boolTypes); diff --git a/src/Symfony/Component/TypeInfo/TypeContext/TypeContextFactory.php b/src/Symfony/Component/TypeInfo/TypeContext/TypeContextFactory.php index d268c85fe49b0..a149a52249ba7 100644 --- a/src/Symfony/Component/TypeInfo/TypeContext/TypeContextFactory.php +++ b/src/Symfony/Component/TypeInfo/TypeContext/TypeContextFactory.php @@ -199,32 +199,85 @@ private function collectTypeAliases(\ReflectionClass $reflection, TypeContext $t } $aliases = []; - foreach ($this->getPhpDocNode($rawDocNode)->getTagsByName('@psalm-type') + $this->getPhpDocNode($rawDocNode)->getTagsByName('@phpstan-type') as $tag) { - if (!$tag->value instanceof TypeAliasTagValueNode) { + $resolvedAliases = []; + + foreach ($this->getPhpDocNode($rawDocNode)->getTagsByName('@psalm-import-type') + $this->getPhpDocNode($rawDocNode)->getTagsByName('@phpstan-import-type') as $tag) { + if (!$tag->value instanceof TypeAliasImportTagValueNode) { continue; } - $aliases[$tag->value->alias] = $this->stringTypeResolver->resolve((string) $tag->value->type, $typeContext); + $importedFromType = $this->stringTypeResolver->resolve((string) $tag->value->importedFrom, $typeContext); + if (!$importedFromType instanceof ObjectType) { + throw new LogicException(\sprintf('Type alias "%s" is not imported from a valid class name.', $tag->value->importedAlias)); + } + + $importedFromContext = $this->createFromClassName($importedFromType->getClassName()); + + $typeAlias = $importedFromContext->typeAliases[$tag->value->importedAlias] ?? null; + if (!$typeAlias) { + throw new LogicException(\sprintf('Cannot find any "%s" type alias in "%s".', $tag->value->importedAlias, $importedFromType->getClassName())); + } + + $resolvedAliases[$tag->value->importedAs ?? $tag->value->importedAlias] = $typeAlias; } - foreach ($this->getPhpDocNode($rawDocNode)->getTagsByName('@psalm-import-type') + $this->getPhpDocNode($rawDocNode)->getTagsByName('@phpstan-import-type') as $tag) { - if (!$tag->value instanceof TypeAliasImportTagValueNode) { + foreach ($this->getPhpDocNode($rawDocNode)->getTagsByName('@psalm-type') + $this->getPhpDocNode($rawDocNode)->getTagsByName('@phpstan-type') as $tag) { + if (!$tag->value instanceof TypeAliasTagValueNode) { continue; } - /** @var ObjectType $importedType */ - $importedType = $this->stringTypeResolver->resolve((string) $tag->value->importedFrom, $typeContext); - $importedTypeContext = $this->createFromClassName($importedType->getClassName()); + $aliases[$tag->value->alias] = (string) $tag->value->type; + } - $typeAlias = $importedTypeContext->typeAliases[$tag->value->importedAlias] ?? null; - if (!$typeAlias) { - throw new LogicException(\sprintf('Cannot find any "%s" type alias in "%s".', $tag->value->importedAlias, $importedType->getClassName())); + return $this->resolveTypeAliases($aliases, $resolvedAliases, $typeContext); + } + + /** + * @param array $toResolve + * @param array $resolved + * + * @return array + */ + private function resolveTypeAliases(array $toResolve, array $resolved, TypeContext $typeContext): array + { + if (!$toResolve) { + return []; + } + + $typeContext = new TypeContext( + $typeContext->calledClassName, + $typeContext->declaringClassName, + $typeContext->namespace, + $typeContext->uses, + $typeContext->templates, + $typeContext->typeAliases + $resolved, + ); + + $succeeded = false; + $lastFailure = null; + $lastFailingAlias = null; + + foreach ($toResolve as $alias => $type) { + try { + $resolved[$alias] = $this->stringTypeResolver->resolve($type, $typeContext); + unset($toResolve[$alias]); + $succeeded = true; + } catch (UnsupportedException $lastFailure) { + $lastFailingAlias = $alias; } + } + + // nothing has succeeded, the result won't be different from the + // previous one, we can stop here. + if (!$succeeded) { + throw new LogicException(\sprintf('Cannot resolve "%s" type alias.', $lastFailingAlias), 0, $lastFailure); + } - $aliases[$tag->value->importedAs ?? $tag->value->importedAlias] = $typeAlias; + if ($toResolve) { + return $this->resolveTypeAliases($toResolve, $resolved, $typeContext); } - return $aliases; + return $resolved; } private function getPhpDocNode(string $rawDocNode): PhpDocNode diff --git a/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php b/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php index 475e0212490d7..43457c9314fca 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; @@ -195,6 +196,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 diff --git a/src/Symfony/Component/Uid/AbstractUid.php b/src/Symfony/Component/Uid/AbstractUid.php index 142234118b3e6..fa35031eaa789 100644 --- a/src/Symfony/Component/Uid/AbstractUid.php +++ b/src/Symfony/Component/Uid/AbstractUid.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Uid; +use Symfony\Component\Uid\Exception\InvalidArgumentException; + /** * @author Nicolas Grekas */ @@ -29,41 +31,41 @@ abstract public static function isValid(string $uid): bool; /** * Creates an AbstractUid from an identifier represented in any of the supported formats. * - * @throws \InvalidArgumentException When the passed value is not valid + * @throws InvalidArgumentException When the passed value is not valid */ abstract public static function fromString(string $uid): static; /** - * @throws \InvalidArgumentException When the passed value is not valid + * @throws InvalidArgumentException When the passed value is not valid */ public static function fromBinary(string $uid): static { if (16 !== \strlen($uid)) { - throw new \InvalidArgumentException('Invalid binary uid provided.'); + throw new InvalidArgumentException('Invalid binary uid provided.'); } return static::fromString($uid); } /** - * @throws \InvalidArgumentException When the passed value is not valid + * @throws InvalidArgumentException When the passed value is not valid */ public static function fromBase58(string $uid): static { if (22 !== \strlen($uid)) { - throw new \InvalidArgumentException('Invalid base-58 uid provided.'); + throw new InvalidArgumentException('Invalid base-58 uid provided.'); } return static::fromString($uid); } /** - * @throws \InvalidArgumentException When the passed value is not valid + * @throws InvalidArgumentException When the passed value is not valid */ public static function fromBase32(string $uid): static { if (26 !== \strlen($uid)) { - throw new \InvalidArgumentException('Invalid base-32 uid provided.'); + throw new InvalidArgumentException('Invalid base-32 uid provided.'); } return static::fromString($uid); @@ -72,12 +74,12 @@ public static function fromBase32(string $uid): static /** * @param string $uid A valid RFC 9562/4122 uid * - * @throws \InvalidArgumentException When the passed value is not valid + * @throws InvalidArgumentException When the passed value is not valid */ public static function fromRfc4122(string $uid): static { if (36 !== \strlen($uid)) { - throw new \InvalidArgumentException('Invalid RFC4122 uid provided.'); + throw new InvalidArgumentException('Invalid RFC4122 uid provided.'); } return static::fromString($uid); diff --git a/src/Symfony/Component/Uid/BinaryUtil.php b/src/Symfony/Component/Uid/BinaryUtil.php index 1a469fc56829c..7d1e524e5e43e 100644 --- a/src/Symfony/Component/Uid/BinaryUtil.php +++ b/src/Symfony/Component/Uid/BinaryUtil.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Uid; +use Symfony\Component\Uid\Exception\InvalidArgumentException; + /** * @internal * @@ -162,7 +164,7 @@ public static function dateTimeToHex(\DateTimeInterface $time): string { if (\PHP_INT_SIZE >= 8) { if (-self::TIME_OFFSET_INT > $time = (int) $time->format('Uu0')) { - throw new \InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.'); + throw new InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.'); } return str_pad(dechex(self::TIME_OFFSET_INT + $time), 16, '0', \STR_PAD_LEFT); @@ -171,7 +173,7 @@ public static function dateTimeToHex(\DateTimeInterface $time): string $time = $time->format('Uu0'); $negative = '-' === $time[0]; if ($negative && self::TIME_OFFSET_INT < $time = substr($time, 1)) { - throw new \InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.'); + throw new InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.'); } $time = self::fromBase($time, self::BASE10); $time = str_pad($time, 8, "\0", \STR_PAD_LEFT); diff --git a/src/Symfony/Component/Uid/CHANGELOG.md b/src/Symfony/Component/Uid/CHANGELOG.md index f53899b6061c2..31291948419c5 100644 --- a/src/Symfony/Component/Uid/CHANGELOG.md +++ b/src/Symfony/Component/Uid/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +7.3 +--- + + * Add component-specific exception hierarchy + 7.2 --- diff --git a/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php b/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php index 2117eb753e30c..cd99acdd34cf5 100644 --- a/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php +++ b/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php @@ -20,6 +20,7 @@ use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Uid\Exception\LogicException; use Symfony\Component\Uid\Factory\UuidFactory; use Symfony\Component\Uid\Uuid; @@ -146,7 +147,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $create = function () use ($namespace, $name): Uuid { try { $factory = $this->factory->nameBased($namespace); - } catch (\LogicException) { + } catch (LogicException) { throw new \InvalidArgumentException('Missing namespace: use the "--namespace" option or configure a default namespace in the underlying factory.'); } diff --git a/src/Symfony/Component/Uid/Exception/InvalidArgumentException.php b/src/Symfony/Component/Uid/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000000..c28737bea8b2a --- /dev/null +++ b/src/Symfony/Component/Uid/Exception/InvalidArgumentException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Uid\Exception; + +class InvalidArgumentException extends \InvalidArgumentException +{ +} diff --git a/src/Symfony/Component/Uid/Exception/LogicException.php b/src/Symfony/Component/Uid/Exception/LogicException.php new file mode 100644 index 0000000000000..2f0f6927cae18 --- /dev/null +++ b/src/Symfony/Component/Uid/Exception/LogicException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Uid\Exception; + +class LogicException extends \LogicException +{ +} diff --git a/src/Symfony/Component/Uid/Factory/UuidFactory.php b/src/Symfony/Component/Uid/Factory/UuidFactory.php index f95082d2c8b39..2469ab9fdc27e 100644 --- a/src/Symfony/Component/Uid/Factory/UuidFactory.php +++ b/src/Symfony/Component/Uid/Factory/UuidFactory.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Uid\Factory; +use Symfony\Component\Uid\Exception\LogicException; use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\UuidV1; use Symfony\Component\Uid\UuidV4; @@ -67,12 +68,15 @@ public function timeBased(Uuid|string|null $node = null): TimeBasedUuidFactory return new TimeBasedUuidFactory($this->timeBasedClass, $node); } + /** + * @throws LogicException When no namespace is defined + */ public function nameBased(Uuid|string|null $namespace = null): NameBasedUuidFactory { $namespace ??= $this->nameBasedNamespace; if (null === $namespace) { - throw new \LogicException(\sprintf('A namespace should be defined when using "%s()".', __METHOD__)); + throw new LogicException(\sprintf('A namespace should be defined when using "%s()".', __METHOD__)); } return new NameBasedUuidFactory($this->nameBasedClass, $this->getNamespace($namespace)); diff --git a/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php b/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php index 5f86f736f32d9..3f2c493f57b99 100644 --- a/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php +++ b/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Uid\Tests\Factory; use PHPUnit\Framework\TestCase; +use Symfony\Component\Uid\Exception\InvalidArgumentException; use Symfony\Component\Uid\Factory\UlidFactory; final class UlidFactoryTest extends TestCase @@ -36,7 +37,7 @@ public function testCreate() public function testCreateWithInvalidTimestamp() { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The timestamp must be positive.'); (new UlidFactory())->create(new \DateTimeImmutable('@-1000')); diff --git a/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php b/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php index 259a84a3fe372..bd3e87fcddf0d 100644 --- a/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php +++ b/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Uid\Tests\Factory; use PHPUnit\Framework\TestCase; +use Symfony\Component\Uid\Exception\InvalidArgumentException; use Symfony\Component\Uid\Factory\UuidFactory; use Symfony\Component\Uid\NilUuid; use Symfony\Component\Uid\Uuid; @@ -81,7 +82,7 @@ public function testCreateTimed() public function testInvalidCreateTimed() { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('The given UUID date cannot be earlier than 1582-10-15.'); (new UuidFactory())->timeBased()->create(new \DateTimeImmutable('@-12219292800.001000')); diff --git a/src/Symfony/Component/Uid/Tests/UlidTest.php b/src/Symfony/Component/Uid/Tests/UlidTest.php index 338b699159a77..f34660fbfd393 100644 --- a/src/Symfony/Component/Uid/Tests/UlidTest.php +++ b/src/Symfony/Component/Uid/Tests/UlidTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Uid\Tests; use PHPUnit\Framework\TestCase; +use Symfony\Component\Uid\Exception\InvalidArgumentException; use Symfony\Component\Uid\MaxUlid; use Symfony\Component\Uid\NilUlid; use Symfony\Component\Uid\Tests\Fixtures\CustomUlid; @@ -41,7 +42,7 @@ public function testGenerate() public function testWithInvalidUlid() { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid ULID: "this is not a ulid".'); new Ulid('this is not a ulid'); @@ -151,7 +152,7 @@ public function testFromBinary() */ public function testFromBinaryInvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Ulid::fromBinary($ulid); } @@ -178,7 +179,7 @@ public function testFromBase58() */ public function testFromBase58InvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Ulid::fromBase58($ulid); } @@ -205,7 +206,7 @@ public function testFromBase32() */ public function testFromBase32InvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Ulid::fromBase32($ulid); } @@ -232,7 +233,7 @@ public function testFromRfc4122() */ public function testFromRfc4122InvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Ulid::fromRfc4122($ulid); } diff --git a/src/Symfony/Component/Uid/Tests/UuidTest.php b/src/Symfony/Component/Uid/Tests/UuidTest.php index 5dfdc6d7c1dde..b6986b09ebaa2 100644 --- a/src/Symfony/Component/Uid/Tests/UuidTest.php +++ b/src/Symfony/Component/Uid/Tests/UuidTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Uid\Tests; use PHPUnit\Framework\TestCase; +use Symfony\Component\Uid\Exception\InvalidArgumentException; use Symfony\Component\Uid\MaxUuid; use Symfony\Component\Uid\NilUuid; use Symfony\Component\Uid\Tests\Fixtures\CustomUuid; @@ -35,7 +36,7 @@ class UuidTest extends TestCase */ public function testConstructorWithInvalidUuid(string $uuid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid UUID: "'.$uuid.'".'); Uuid::fromString($uuid); @@ -58,7 +59,7 @@ public function testInvalidVariant(string $uuid) $uuid = (string) $uuid; $class = Uuid::class.'V'.$uuid[14]; - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid UUIDv'.$uuid[14].': "'.$uuid.'".'); new $class($uuid); @@ -381,7 +382,7 @@ public function testFromBinary() */ public function testFromBinaryInvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Uuid::fromBinary($ulid); } @@ -408,7 +409,7 @@ public function testFromBase58() */ public function testFromBase58InvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Uuid::fromBase58($ulid); } @@ -435,7 +436,7 @@ public function testFromBase32() */ public function testFromBase32InvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Uuid::fromBase32($ulid); } @@ -462,7 +463,7 @@ public function testFromRfc4122() */ public function testFromRfc4122InvalidFormat(string $ulid) { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); Uuid::fromRfc4122($ulid); } @@ -509,7 +510,7 @@ public function testV1ToV6() public function testV1ToV7BeforeUnixEpochThrows() { - $this->expectException(\InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Cannot convert UUID to v7: its timestamp is before the Unix epoch.'); (new UuidV1('9aba8000-ff00-11b0-b3db-3b3fc83afdfc'))->toV7(); // Timestamp is 1969-01-01 00:00:00.0000000 diff --git a/src/Symfony/Component/Uid/Ulid.php b/src/Symfony/Component/Uid/Ulid.php index 1240b019e28e2..5ea3b84051880 100644 --- a/src/Symfony/Component/Uid/Ulid.php +++ b/src/Symfony/Component/Uid/Ulid.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Uid; +use Symfony\Component\Uid\Exception\InvalidArgumentException; + /** * A ULID is lexicographically sortable and contains a 48-bit timestamp and 80-bit of crypto-random entropy. * @@ -36,7 +38,7 @@ public function __construct(?string $ulid = null) $this->uid = $ulid; } else { if (!self::isValid($ulid)) { - throw new \InvalidArgumentException(\sprintf('Invalid ULID: "%s".', $ulid)); + throw new InvalidArgumentException(\sprintf('Invalid ULID: "%s".', $ulid)); } $this->uid = strtoupper($ulid); @@ -154,7 +156,7 @@ public static function generate(?\DateTimeInterface $time = null): string $time = microtime(false); $time = substr($time, 11).substr($time, 2, 3); } elseif (0 > $time = $time->format('Uv')) { - throw new \InvalidArgumentException('The timestamp must be positive.'); + throw new InvalidArgumentException('The timestamp must be positive.'); } if ($time > self::$time || (null !== $mtime && $time !== self::$time)) { diff --git a/src/Symfony/Component/Uid/Uuid.php b/src/Symfony/Component/Uid/Uuid.php index c956156a3d580..e1c9735ee85fe 100644 --- a/src/Symfony/Component/Uid/Uuid.php +++ b/src/Symfony/Component/Uid/Uuid.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Uid; +use Symfony\Component\Uid\Exception\InvalidArgumentException; + /** * @author Grégoire Pineau * @@ -39,13 +41,13 @@ public function __construct(string $uuid, bool $checkVariant = false) $type = preg_match('{^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$}Di', $uuid) ? (int) $uuid[14] : false; if (false === $type || (static::TYPE ?: $type) !== $type) { - throw new \InvalidArgumentException(\sprintf('Invalid UUID%s: "%s".', static::TYPE ? 'v'.static::TYPE : '', $uuid)); + throw new InvalidArgumentException(\sprintf('Invalid UUID%s: "%s".', static::TYPE ? 'v'.static::TYPE : '', $uuid)); } $this->uid = strtolower($uuid); if ($checkVariant && !\in_array($this->uid[19], ['8', '9', 'a', 'b'], true)) { - throw new \InvalidArgumentException(\sprintf('Invalid UUID%s: "%s".', static::TYPE ? 'v'.static::TYPE : '', $uuid)); + throw new InvalidArgumentException(\sprintf('Invalid UUID%s: "%s".', static::TYPE ? 'v'.static::TYPE : '', $uuid)); } } diff --git a/src/Symfony/Component/Uid/UuidV6.php b/src/Symfony/Component/Uid/UuidV6.php index 1559ac17a62b3..ea65ae4120289 100644 --- a/src/Symfony/Component/Uid/UuidV6.php +++ b/src/Symfony/Component/Uid/UuidV6.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Uid; +use Symfony\Component\Uid\Exception\InvalidArgumentException; + /** * A v6 UUID is lexicographically sortable and contains a 60-bit timestamp and 62 extra unique bits. * @@ -48,7 +50,7 @@ public function toV7(): UuidV7 $uuid = $this->uid; $time = BinaryUtil::hexToNumericString('0'.substr($uuid, 0, 8).substr($uuid, 9, 4).substr($uuid, 15, 3)); if ('-' === $time[0]) { - throw new \InvalidArgumentException('Cannot convert UUID to v7: its timestamp is before the Unix epoch.'); + throw new InvalidArgumentException('Cannot convert UUID to v7: its timestamp is before the Unix epoch.'); } $ms = \strlen($time) > 4 ? substr($time, 0, -4) : '0'; diff --git a/src/Symfony/Component/Uid/UuidV7.php b/src/Symfony/Component/Uid/UuidV7.php index 0be7fcb341b09..0a6f01be1f234 100644 --- a/src/Symfony/Component/Uid/UuidV7.php +++ b/src/Symfony/Component/Uid/UuidV7.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Uid; +use Symfony\Component\Uid\Exception\InvalidArgumentException; + /** * A v7 UUID is lexicographically sortable and contains a 48-bit timestamp and 74 extra unique bits. * @@ -55,7 +57,7 @@ public static function generate(?\DateTimeInterface $time = null): string $time = microtime(false); $time = substr($time, 11).substr($time, 2, 3); } elseif (0 > $time = $time->format('Uv')) { - throw new \InvalidArgumentException('The timestamp must be positive.'); + throw new InvalidArgumentException('The timestamp must be positive.'); } if ($time > self::$time || (null !== $mtime && $time !== self::$time)) { diff --git a/src/Symfony/Component/Validator/CHANGELOG.md b/src/Symfony/Component/Validator/CHANGELOG.md index ae1ae20da804d..e8146d2a50683 100644 --- a/src/Symfony/Component/Validator/CHANGELOG.md +++ b/src/Symfony/Component/Validator/CHANGELOG.md @@ -6,9 +6,56 @@ CHANGELOG * Add the `filenameCharset` and `filenameCountUnit` options to the `File` constraint * Deprecate defining custom constraints not supporting named arguments + + Before: + + ```php + use Symfony\Component\Validator\Constraint; + + class CustomConstraint extends Constraint + { + public function __construct(array $options) + { + // ... + } + } + ``` + + After: + + ```php + use Symfony\Component\Validator\Attribute\HasNamedArguments; + use Symfony\Component\Validator\Constraint; + + class CustomConstraint extends Constraint + { + #[HasNamedArguments] + public function __construct($option1, $option2, $groups, $payload) + { + // ... + } + } + ``` * Deprecate passing an array of options to the constructors of the constraint classes, pass each option as a dedicated argument instead + + Before: + + ```php + new NotNull([ + 'groups' => ['foo', 'bar'], + 'message' => 'a custom constraint violation message', + ]) + ``` + + After: + + ```php + new NotNull( + groups: ['foo', 'bar'], + message: 'a custom constraint violation message', + ) + ``` * Add support for ratio checks for SVG files to the `Image` constraint - * Add the `Slug` constraint * Add support for the `otherwise` option in the `When` constraint * Add support for multiple fields containing nested constraints in `Composite` constraints * Add the `stopOnFirstError` option to the `Unique` constraint to validate all elements diff --git a/src/Symfony/Component/Validator/Constraints/Cascade.php b/src/Symfony/Component/Validator/Constraints/Cascade.php index a3ea71dbf90a9..7d90cfcf7f99f 100644 --- a/src/Symfony/Component/Validator/Constraints/Cascade.php +++ b/src/Symfony/Component/Validator/Constraints/Cascade.php @@ -36,6 +36,7 @@ public function __construct(array|string|null $exclude = null, ?array $options = trigger_deprecation('symfony/validator', '7.3', 'Passing an array of options to configure the "%s" constraint is deprecated, use named arguments instead.', static::class); $options = array_merge($exclude, $options ?? []); + $options['exclude'] = array_flip((array) ($options['exclude'] ?? [])); } else { if (\is_array($options)) { trigger_deprecation('symfony/validator', '7.3', 'Passing an array of options to configure the "%s" constraint is deprecated, use named arguments instead.', static::class); diff --git a/src/Symfony/Component/Validator/Constraints/Image.php b/src/Symfony/Component/Validator/Constraints/Image.php index 59cd6ba883a32..5a4b3e12960e8 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; @@ -165,6 +165,8 @@ public function __construct( ?string $corruptedMessage = null, ?array $groups = null, mixed $payload = null, + array|string|null $extensions = null, + ?string $extensionsMessage = null, ?string $filenameCharset = null, ?string $filenameCountUnit = null, ?string $filenameCharsetMessage = null, @@ -191,6 +193,8 @@ public function __construct( $uploadErrorMessage, $groups, $payload, + $extensions, + $extensionsMessage, $filenameCharset, $filenameCountUnit, $filenameCharsetMessage, @@ -222,6 +226,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 f81c731da0c0c..5c8501fa060fc 100644 --- a/src/Symfony/Component/Validator/Constraints/Regex.php +++ b/src/Symfony/Component/Validator/Constraints/Regex.php @@ -39,7 +39,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|null $options */ diff --git a/src/Symfony/Component/Validator/Constraints/Slug.php b/src/Symfony/Component/Validator/Constraints/Slug.php deleted file mode 100644 index 52a5d94c2d93b..0000000000000 --- a/src/Symfony/Component/Validator/Constraints/Slug.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Validator\Constraints; - -use Symfony\Component\Validator\Attribute\HasNamedArguments; -use Symfony\Component\Validator\Constraint; - -/** - * Validates that a value is a valid slug. - * - * @author Raffaele Carelle - */ -#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] -class Slug extends Constraint -{ - public const NOT_SLUG_ERROR = '14e6df1e-c8ab-4395-b6ce-04b132a3765e'; - - public string $message = 'This value is not a valid slug.'; - public string $regex = '/^[a-z0-9]+(?:-[a-z0-9]+)*$/'; - - #[HasNamedArguments] - public function __construct( - ?string $regex = null, - ?string $message = null, - ?array $groups = null, - mixed $payload = null, - ) { - parent::__construct([], $groups, $payload); - - $this->message = $message ?? $this->message; - $this->regex = $regex ?? $this->regex; - } -} diff --git a/src/Symfony/Component/Validator/Constraints/SlugValidator.php b/src/Symfony/Component/Validator/Constraints/SlugValidator.php deleted file mode 100644 index b914cad31b466..0000000000000 --- a/src/Symfony/Component/Validator/Constraints/SlugValidator.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Validator\Constraints; - -use Symfony\Component\Validator\Constraint; -use Symfony\Component\Validator\ConstraintValidator; -use Symfony\Component\Validator\Exception\UnexpectedTypeException; -use Symfony\Component\Validator\Exception\UnexpectedValueException; - -/** - * @author Raffaele Carelle - */ -class SlugValidator extends ConstraintValidator -{ - public function validate(mixed $value, Constraint $constraint): void - { - if (!$constraint instanceof Slug) { - throw new UnexpectedTypeException($constraint, Slug::class); - } - - if (null === $value || '' === $value) { - return; - } - - if (!\is_scalar($value) && !$value instanceof \Stringable) { - throw new UnexpectedValueException($value, 'string'); - } - - $value = (string) $value; - - if (0 === preg_match($constraint->regex, $value)) { - $this->context->buildViolation($constraint->message) - ->setParameter('{{ value }}', $this->formatValue($value)) - ->setCode(Slug::NOT_SLUG_ERROR) - ->addViolation(); - } - } -} diff --git a/src/Symfony/Component/Validator/Constraints/Type.php b/src/Symfony/Component/Validator/Constraints/Type.php index 747c6add4ae60..f3fe56dbbc2d1 100644 --- a/src/Symfony/Component/Validator/Constraints/Type.php +++ b/src/Symfony/Component/Validator/Constraints/Type.php @@ -32,9 +32,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|null $options + * @param string|list|array|null $type The type(s) to enforce on the value + * @param string[]|null $groups + * @param array|null $options */ #[HasNamedArguments] public function __construct(string|array|null $type, ?string $message = null, ?array $groups = null, mixed $payload = null, ?array $options = null) 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/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 520f6a41f77c4..9f53b1afe35c3 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.af.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.af.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Hierdie waarde mag nie na week "{{ max }}" kom nie. - - This value is not a valid slug. - Hierdie waarde is nie 'n geldige slug 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 d139f1bd1abbe..827eed1bcc86e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ar.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ar.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". يجب ألا تكون هذه القيمة بعد الأسبوع "{{ max }}". - - This value is not a valid slug. - هذه القيمة ليست رمزا صالحا. + + 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 2469d4e8d8df7..9332c9ec2fd93 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf @@ -466,9 +466,9 @@ 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 slug. - Bu dəyər etibarlı slug deyil. + + 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 5cb9244acb286..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,47 +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. - Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б адно слова.|Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б {{ min }} словы. + Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б адно слова.|Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б {{ min }} слоў. 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. - Гэта значэнне не адпавядае правільнаму тыдні ў фармаце ISO 8601. + Гэта значэнне не адпавядае сапраўднаму тыдню ў фармаце ISO 8601. This value is not a valid week. - Гэта значэнне не з'яўляецца сапраўдным тыднем. + Гэта значэнне не з'яўляецца сапраўдным тыднем. This value should not be before week "{{ min }}". - Гэта значэнне не павінна быць раней за тыдзень "{{ min }}". + Гэта значэнне не павінна быць раней за тыдзень "{{ min }}". This value should not be after week "{{ max }}". - Гэта значэнне не павінна быць пасля тыдня "{{ max }}". + Гэта значэнне не павінна быць пасля тыдня "{{ max }}". - - This value is not a valid slug. - Гэта значэнне не з'яўляецца сапраўдным слугам. + + 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 11af46eaa60f5..afd7590f51cb9 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Тази стойност не трябва да бъде след седмица "{{ max }}". - - This value is not a valid slug. - Тази стойност не е валиден слаг. + + 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 19ece8de3672c..d6b7de5768ee5 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.bs.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.bs.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Ova vrijednost ne bi trebala biti nakon sedmice "{{ max }}". - - This value is not a valid slug. - Ova vrijednost nije važeći slug. + + 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 ca56078262a73..d656ef540f825 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf @@ -466,9 +466,9 @@ 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 slug. - Aquest valor no és un slug vàlid. + + 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 b45c9c285a54c..d5f48f0ae7ff2 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf @@ -466,9 +466,9 @@ 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 slug. - Tato hodnota není platný slug. + + 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 d06175cf1fb51..08a76667d5f4a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.cy.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.cy.xlf @@ -466,9 +466,9 @@ 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 slug. - Nid yw'r gwerth hwn yn slug dilys. + + 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 3ae04f37ed36a..bb05bba2e641c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.da.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.da.xlf @@ -466,9 +466,9 @@ 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 slug. - Denne værdi er ikke en gyldig slug. + + 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 3fa8f86ecf394..f02c56c6c5ca9 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Dieser Wert darf nicht nach der Woche "{{ max }}" sein. - - This value is not a valid slug. - Dieser Wert ist kein gültiger Slug. + + 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 9934d6d971000..9aec12ff82ce7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.el.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.el.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Αυτή η τιμή δεν πρέπει να είναι μετά την εβδομάδα "{{ max }}". - - This value is not a valid slug. - Αυτή η τιμή δεν είναι έγκυρο slug. + + 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 6ccbfc488de55..f8c664f18c423 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.en.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.en.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". This value should not be after week "{{ max }}". - - This value is not a valid slug. - This value is not a valid slug. + + 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 deaa6c59757a2..a9ad8a76b11e9 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Este valor no debe ser posterior a la semana "{{ max }}". - - This value is not a valid slug. - Este valor no es un slug válido. + + 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 0066917cfb771..2375aa4ade30c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.et.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.et.xlf @@ -466,9 +466,9 @@ 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 slug. - See väärtus ei ole kehtiv slug. + + 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 6af677cab21ff..830f8673dff94 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.eu.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.eu.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Balio hau ez luke astearen "{{ max }}" ondoren egon behar. - - This value is not a valid slug. - Balio hau ez da slug balioduna. + + 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 a9cd0f2cdb9c5..f47633fd4a624 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.fa.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.fa.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". این مقدار نباید بعد از هفته "{{ max }}" باشد. - - This value is not a valid slug. - این مقدار یک slug معتبر نیست. + + 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 6da8964d1b493..c046963f7ec66 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.fi.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.fi.xlf @@ -466,9 +466,9 @@ 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 slug. - Tämä arvo ei ole kelvollinen slug. + + 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 980a19ecc56aa..13033c01973c8 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.fr.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.fr.xlf @@ -466,9 +466,9 @@ 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 slug. - Cette valeur n'est pas un slug valide. + + 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 e3f7bd227357f..391d741e96564 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.gl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.gl.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Este valor non debe estar despois da semana "{{ max }}". - - This value is not a valid slug. - Este valor non é un slug válido. + + 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 107051c11dfd2..671a98881536e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.he.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.he.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". ערך זה לא אמור להיות לאחר שבוע "{{ max }}". - - This value is not a valid slug. - ערך זה אינו slug חוקי. + + 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 a436950b27258..0951d41926514 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.hr.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.hr.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Ova vrijednost ne bi trebala biti nakon tjedna "{{ max }}". - - This value is not a valid slug. - Ova vrijednost nije valjani slug. + + 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 ebeb01d47beac..dffab0ccbf700 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.hu.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.hu.xlf @@ -466,9 +466,9 @@ 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 slug. - Ez az érték nem érvényes slug. + + 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 78ae0921162b3..856babbd5fe4e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Այս արժեքը չպետք է լինի «{{ max }}» շաբաթից հետո։ - - This value is not a valid slug. - Այս արժեքը վավեր slug չէ: + + 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 bf9187b74c339..b9796f888f924 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.id.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.id.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Nilai ini tidak boleh setelah minggu "{{ max }}". - - This value is not a valid slug. - Nilai ini bukan slug yang valid. + + 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 9aa09394cc37e..34ef61ed5f8a7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.it.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.it.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Questo valore non dovrebbe essere dopo la settimana "{{ max }}". - - This value is not a valid slug. - Questo valore non è uno slug valido. + + 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 f6d2e0c28a33e..e83aced818553 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". この値は週 "{{ max }}" 以降であってはいけません。 - - This value is not a valid slug. - この値は有効なスラグではありません。 + + 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 fadc5b0813cf4..d1b5cef57bd0e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.lb.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.lb.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Dëse Wäert sollt net no Woch "{{ max }}" sinn. - - This value is not a valid slug. - Dëse Wäert ass kee gültege Slug. + + 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 add3881869eab..46abd95036044 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.lt.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.lt.xlf @@ -466,9 +466,9 @@ 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 slug. - Ši reikšmė nėra tinkamas slug. + + 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 792cd724a62c2..3e2d51a30dec1 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.lv.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.lv.xlf @@ -466,9 +466,9 @@ 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 slug. - Šī vērtība nav derīgs slug. + + 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 042e180afedfc..99b1a191b6c0d 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.mk.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.mk.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Ова вредност не треба да биде по недела "{{ max }}". - - This value is not a valid slug. - Оваа вредност не е валиден slug. + + 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 238080cc407b9..3344675d9ae6a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.mn.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.mn.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Энэ утга нь долоо хоног "{{ max }}" -аас хойш байх ёсгүй. - - This value is not a valid slug. - Энэ утга хүчинтэй slug биш байна. + + 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 c9b670ea6a1af..04c955f754509 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.my.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.my.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". ဤတန်ဖိုးသည် သီတင်းပတ် "{{ max }}" ပြီးနောက် ဖြစ်သင့်သည်မဟုတ်ပါ။ - - This value is not a valid slug. - ဒီတန်ဖိုးသည်မှန်ကန်သော slug မဟုတ်ပါ။ + + 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 f5078d76391a0..58696f671ca4a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Denne verdien bør ikke være etter uke "{{ max }}". - - This value is not a valid slug. - Denne verdien er ikke en gyldig slug. + + 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 ae378a6269bf7..1781b1f29ec64 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.nl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.nl.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Deze waarde mag niet na week "{{ max }}" liggen. - - This value is not a valid slug. - Deze waarde is geen geldige slug. + + 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 e483422f196af..74d332c06efb2 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.nn.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.nn.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Denne verdien bør ikkje vere etter veke "{{ max }}". - - This value is not a valid slug. - Denne verdien er ikkje ein gyldig slug. + + 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 f5078d76391a0..58696f671ca4a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.no.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.no.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Denne verdien bør ikke være etter uke "{{ max }}". - - This value is not a valid slug. - Denne verdien er ikke en gyldig slug. + + 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 8946381120ae7..7c243a6b0ca02 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.pl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.pl.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Ta wartość nie powinna być po tygodniu "{{ max }}". - - This value is not a valid slug. - Ta wartość nie jest prawidłowym slugiem. + + 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 68a7f5ff6c7ea..b6562dbfe712f 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.pt.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.pt.xlf @@ -466,9 +466,9 @@ 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 slug. - Este valor não é um slug válido. + + 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 a7be9976c4b60..0acf6dbf23a6c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf @@ -466,9 +466,9 @@ 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 slug. - Este valor não é um slug válido. + + 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 73dc6f2e0d235..d6c3b4fb82984 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf @@ -466,9 +466,9 @@ 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 slug. - Această valoare nu este un slug valid. + + 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 b382b77bb00fa..727ae0aefdf86 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ru.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ru.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Это значение не должно быть после недели "{{ max }}". - - This value is not a valid slug. - Это значение не является допустимым slug. + + 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 d7cf634c7e909..bba3c291a7fed 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sk.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sk.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Táto hodnota by nemala byť po týždni "{{ max }}". - - This value is not a valid slug. - Táto hodnota nie je platný slug. + + 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 b89608949b50c..28c370e096887 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sl.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Ta vrednost ne sme biti po tednu "{{ max }}". - - This value is not a valid slug. - Ta vrednost ni veljaven URL slug. + + 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 7fb6b041f8486..ba7178f672ef7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sq.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sq.xlf @@ -475,9 +475,9 @@ This value should not be after week "{{ max }}". Kjo vlerë nuk duhet të jetë pas javës "{{ max }}". - - This value is not a valid slug. - Kjo vlerë nuk është një slug i vlefshëm. + + 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 dda7e1fab683e..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,9 +466,9 @@ This value should not be after week "{{ max }}". Ова вредност не треба да буде после недеље "{{ max }}". - - This value is not a valid slug. - Ова вредност није валидан слуг. + + 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 a521dbaa70474..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,9 +466,9 @@ This value should not be after week "{{ max }}". Ova vrednost ne treba da bude posle nedelje "{{ max }}". - - This value is not a valid slug. - Ova vrednost nije validan slug. + + 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 df1be65d8f7e2..692ac7f52d243 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf @@ -466,9 +466,9 @@ 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 slug. - Detta värde är inte en giltig slug. + + 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 a7b4988d2109e..75398a0b84206 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.th.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.th.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". ค่านี้ไม่ควรจะอยู่หลังสัปดาห์ "{{ max }}" - - This value is not a valid slug. - ค่านี้ไม่ใช่ slug ที่ถูกต้อง + + 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 b14e0b75d509b..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,79 +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 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. + 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. - 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. + 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. - Ang halagang ito ay hindi kumakatawan sa isang wastong linggo sa format ng ISO 8601. + Ang halagang ito ay hindi kumakatawan sa isang wastong linggo sa format ng ISO 8601. This value is not a valid week. - Ang halagang ito ay hindi isang wastong linggo. + Ang halagang ito ay hindi isang wastong linggo. This value should not be before week "{{ min }}". - Ang halagang ito ay hindi dapat bago sa linggo "{{ min }}". + Ang halagang ito ay hindi dapat bago sa linggo "{{ min }}". This value should not be after week "{{ max }}". - Ang halagang ito ay hindi dapat pagkatapos ng linggo "{{ max }}". + Ang halagang ito ay hindi dapat pagkatapos ng linggo "{{ max }}". - - This value is not a valid slug. - Ang halagang ito ay hindi isang wastong slug. + + 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 fa69fb2e19e64..42c4bbd91ebab 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Bu değer “{{ max }}” haftasından sonra olmamalıdır - - This value is not a valid slug. - Bu değer geçerli bir “slug” değildir. + + 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 50d503e2455e7..5f132bc77a6ec 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Це значення не повинно бути після тижня "{{ max }}". - - This value is not a valid slug. - Це значення не є дійсним slug. + + 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 d5a819a15ab36..f13aafb43264b 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". یہ قدر ہفتہ "{{ max }}" کے بعد نہیں ہونا چاہیے۔ - - This value is not a valid slug. - یہ قدر درست سلاگ نہیں ہے۔ + + 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 74a795ddf97da..fe0b49f715b12 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". Bu qiymat "{{ max }}" haftadan keyin bo'lmasligi kerak. - - This value is not a valid slug. - Bu qiymat yaroqli slug emas. + + 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 69be73629f88b..9daa4fe8a29d5 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.vi.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.vi.xlf @@ -466,9 +466,9 @@ 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 slug. - Giá trị này không phải là một slug hợp lệ. + + 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 dc6a17605e4c4..c570d936ff17c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf @@ -466,9 +466,9 @@ This value should not be after week "{{ max }}". 该值不应位于 "{{ max }}"周之后。 - - This value is not a valid slug. - 此值不是有效的 slug。 + + 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 fc343e6c8d010..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,9 +466,9 @@ This value should not be after week "{{ max }}". 這個數值不應晚於第「{{ max }}」週。 - - This value is not a valid slug. - 這個數值不是有效的 slug。 + + This value is not a valid Twig template. + 這個數值不是有效的 Twig 模板。 diff --git a/src/Symfony/Component/Validator/Tests/Constraints/CascadeTest.php b/src/Symfony/Component/Validator/Tests/Constraints/CascadeTest.php index ee3798079dc39..fc4d7ce0f3402 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/CascadeTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/CascadeTest.php @@ -27,6 +27,23 @@ public function testCascadeAttribute() self::assertTrue($loader->loadClassMetadata($metadata)); self::assertSame(CascadingStrategy::CASCADE, $metadata->getCascadingStrategy()); } + + public function testExcludeProperties() + { + $constraint = new Cascade(['foo', 'bar']); + + self::assertSame(['foo' => 0, 'bar' => 1], $constraint->exclude); + } + + /** + * @group legacy + */ + public function testExcludePropertiesDoctrineStyle() + { + $constraint = new Cascade(['exclude' => ['foo', 'bar']]); + + self::assertSame(['foo' => 0, 'bar' => 1], $constraint->exclude); + } } #[Cascade] diff --git a/src/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php index a79bd9dd4900a..7a7aa919793ba 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; @@ -688,4 +690,75 @@ public static function provideSvgWithoutViolation(): iterable new Image(maxRatio: 1, maxRatioMessage: 'myMessage'), ]; } + + /** + * @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.'"', + ]) + ->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/SlugTest.php b/src/Symfony/Component/Validator/Tests/Constraints/SlugTest.php deleted file mode 100644 index a2c5b07d3f873..0000000000000 --- a/src/Symfony/Component/Validator/Tests/Constraints/SlugTest.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Validator\Tests\Constraints; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Validator\Constraints\Slug; -use Symfony\Component\Validator\Mapping\ClassMetadata; -use Symfony\Component\Validator\Mapping\Loader\AttributeLoader; - -class SlugTest extends TestCase -{ - public function testAttributes() - { - $metadata = new ClassMetadata(SlugDummy::class); - $loader = new AttributeLoader(); - self::assertTrue($loader->loadClassMetadata($metadata)); - - [$bConstraint] = $metadata->properties['b']->getConstraints(); - self::assertSame('myMessage', $bConstraint->message); - self::assertSame(['Default', 'SlugDummy'], $bConstraint->groups); - - [$cConstraint] = $metadata->properties['c']->getConstraints(); - self::assertSame(['my_group'], $cConstraint->groups); - self::assertSame('some attached data', $cConstraint->payload); - } -} - -class SlugDummy -{ - #[Slug] - private $a; - - #[Slug(message: 'myMessage')] - private $b; - - #[Slug(groups: ['my_group'], payload: 'some attached data')] - private $c; -} diff --git a/src/Symfony/Component/Validator/Tests/Constraints/SlugValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/SlugValidatorTest.php deleted file mode 100644 index e8d210b8377e3..0000000000000 --- a/src/Symfony/Component/Validator/Tests/Constraints/SlugValidatorTest.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Validator\Tests\Constraints; - -use Symfony\Component\Validator\Constraints\Slug; -use Symfony\Component\Validator\Constraints\SlugValidator; -use Symfony\Component\Validator\Exception\UnexpectedValueException; -use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; - -class SlugValidatorTest extends ConstraintValidatorTestCase -{ - protected function createValidator(): SlugValidator - { - return new SlugValidator(); - } - - public function testNullIsValid() - { - $this->validator->validate(null, new Slug()); - - $this->assertNoViolation(); - } - - public function testEmptyStringIsValid() - { - $this->validator->validate('', new Slug()); - - $this->assertNoViolation(); - } - - public function testExpectsStringCompatibleType() - { - $this->expectException(UnexpectedValueException::class); - $this->validator->validate(new \stdClass(), new Slug()); - } - - /** - * @testWith ["test-slug"] - * ["slug-123-test"] - * ["slug"] - */ - public function testValidSlugs($slug) - { - $this->validator->validate($slug, new Slug()); - - $this->assertNoViolation(); - } - - /** - * @testWith ["NotASlug"] - * ["Not a slug"] - * ["not-á-slug"] - * ["not-@-slug"] - */ - public function testInvalidSlugs($slug) - { - $constraint = new Slug(message: 'myMessage'); - - $this->validator->validate($slug, $constraint); - - $this->buildViolation('myMessage') - ->setParameter('{{ value }}', '"'.$slug.'"') - ->setCode(Slug::NOT_SLUG_ERROR) - ->assertRaised(); - } - - /** - * @testWith ["test-slug", true] - * ["slug-123-test", true] - */ - public function testCustomRegexInvalidSlugs($slug) - { - $constraint = new Slug(regex: '/^[a-z0-9]+$/i'); - - $this->validator->validate($slug, $constraint); - - $this->buildViolation($constraint->message) - ->setParameter('{{ value }}', '"'.$slug.'"') - ->setCode(Slug::NOT_SLUG_ERROR) - ->assertRaised(); - } - - /** - * @testWith ["slug"] - * @testWith ["test1234"] - */ - public function testCustomRegexValidSlugs($slug) - { - $constraint = new Slug(regex: '/^[a-z0-9]+$/i'); - - $this->validator->validate($slug, $constraint); - - $this->assertNoViolation(); - } -} diff --git a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php index b1322eac76c1c..5eaca71611065 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/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/Validator/Validator/TraceableValidator.php b/src/Symfony/Component/Validator/Validator/TraceableValidator.php index 5442c53da5a56..6f9ab5bbc4303 100644 --- a/src/Symfony/Component/Validator/Validator/TraceableValidator.php +++ b/src/Symfony/Component/Validator/Validator/TraceableValidator.php @@ -29,6 +29,7 @@ class TraceableValidator implements ValidatorInterface, ResetInterface public function __construct( private ValidatorInterface $validator, + protected readonly ?\Closure $disabled = null, ) { } @@ -56,6 +57,10 @@ public function validate(mixed $value, Constraint|array|null $constraints = null { $violations = $this->validator->validate($value, $constraints, $groups); + if ($this->disabled?->__invoke()) { + return $violations; + } + $trace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 7); $file = $trace[0]['file']; diff --git a/src/Symfony/Component/Validator/composer.json b/src/Symfony/Component/Validator/composer.json index 5177d37d2955a..0eaac5f6bf735 100644 --- a/src/Symfony/Component/Validator/composer.json +++ b/src/Symfony/Component/Validator/composer.json @@ -38,6 +38,7 @@ "symfony/mime": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", "symfony/translation": "^6.4.3|^7.0.3", "symfony/type-info": "^7.1", "egulias/email-validator": "^2.1.10|^3|^4" diff --git a/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php b/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php index 42dc901a5f293..0921f62543a5a 100644 --- a/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php @@ -80,12 +80,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/Cloner/VarCloner.php b/src/Symfony/Component/VarDumper/Cloner/VarCloner.php index 170c8b40aada3..6a7ec2826cb7f 100644 --- a/src/Symfony/Component/VarDumper/Cloner/VarCloner.php +++ b/src/Symfony/Component/VarDumper/Cloner/VarCloner.php @@ -28,14 +28,12 @@ protected function doClone(mixed $var): array $objRefs = []; // Map of original object handles to their stub object counterpart $objects = []; // Keep a ref to objects to ensure their handle cannot be reused while cloning $resRefs = []; // Map of original resource handles to their stub object counterpart - $values = []; // Map of stub objects' ids to original values $maxItems = $this->maxItems; $maxString = $this->maxString; $minDepth = $this->minDepth; $currentDepth = 0; // Current tree depth $currentDepthFinalIndex = 0; // Final $queue index for current tree depth $minimumDepthReached = 0 === $minDepth; // Becomes true when minimum tree depth has been reached - $cookie = (object) []; // Unique object used to detect hard references $a = null; // Array cast for nested structures $stub = null; // Stub capturing the main properties of an original item value // or null if the original value is used directly @@ -53,7 +51,7 @@ protected function doClone(mixed $var): array } } - $refs = $vals = $queue[$i]; + $vals = $queue[$i]; foreach ($vals as $k => $v) { // $v is the original value or a stub object in case of hard references @@ -215,10 +213,6 @@ protected function doClone(mixed $var): array $queue[$i] = $vals; } - foreach ($values as $h => $v) { - $hardRefs[$h] = $v; - } - return $queue; } } 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 = <<expectDeprecation('Since symfony/var-dumper 7.3: The "Symfony\Component\VarDumper\Caster\ResourceCaster::castCurl()" method is deprecated without replacement.'); + $this->expectUserDeprecationMessage('Since symfony/var-dumper 7.3: The "Symfony\Component\VarDumper\Caster\ResourceCaster::castCurl()" method is deprecated without replacement.'); ResourceCaster::castCurl($ch, [], new Stub(), false); } @@ -47,7 +47,7 @@ public function testCastGdIsDeprecated() { $gd = imagecreate(1, 1); - $this->expectDeprecation('Since symfony/var-dumper 7.3: The "Symfony\Component\VarDumper\Caster\ResourceCaster::castGd()" method is deprecated without replacement.'); + $this->expectUserDeprecationMessage('Since symfony/var-dumper 7.3: The "Symfony\Component\VarDumper\Caster\ResourceCaster::castGd()" method is deprecated without replacement.'); ResourceCaster::castGd($gd, [], new Stub(), false); } @@ -69,14 +69,11 @@ public function testCastDbaPriorToPhp84() } /** - * @requires PHP 8.4 + * @requires PHP 8.4.2 + * @requires extension dba */ public function testCastDba() { - if (\PHP_VERSION_ID < 80402) { - $this->markTestSkipped('The test cannot be run on PHP 8.4.0 and PHP 8.4.1, see https://github.com/php/php-src/issues/16990'); - } - $dba = dba_open(sys_get_temp_dir().'/test.db', 'c'); $this->assertDumpMatchesFormat( @@ -89,6 +86,7 @@ public function testCastDba() /** * @requires PHP 8.4 + * @requires extension dba */ public function testCastDbaOnBuggyPhp84() { diff --git a/src/Symfony/Component/VarExporter/Internal/Hydrator.php b/src/Symfony/Component/VarExporter/Internal/Hydrator.php index bc3df10f36f15..450935e5bdaa3 100644 --- a/src/Symfony/Component/VarExporter/Internal/Hydrator.php +++ b/src/Symfony/Component/VarExporter/Internal/Hydrator.php @@ -160,7 +160,7 @@ public static function getSimpleHydrator($class) $object->$name = $value; $object->$name = &$value; } elseif (true !== $noRef) { - $notByRef($object, $value); + $noRef($object, $value); } else { $object->$name = $value; } diff --git a/src/Symfony/Component/VarExporter/ProxyHelper.php b/src/Symfony/Component/VarExporter/ProxyHelper.php index 1fb7eed5ddd7c..b815e7040c501 100644 --- a/src/Symfony/Component/VarExporter/ProxyHelper.php +++ b/src/Symfony/Component/VarExporter/ProxyHelper.php @@ -15,7 +15,6 @@ use Symfony\Component\VarExporter\Internal\Hydrator; use Symfony\Component\VarExporter\Internal\LazyDecoratorTrait; use Symfony\Component\VarExporter\Internal\LazyObjectRegistry; -use Symfony\Component\VarExporter\LazyProxyTrait; /** * @author Nicolas Grekas @@ -86,7 +85,9 @@ public static function generateLazyGhost(\ReflectionClass $class): string $hooks .= "\n " .($p->isProtected() ? 'protected' : 'public') .($p->isProtectedSet() ? ' protected(set)' : '') - ." {$type} \${$name} {\n"; + ." {$type} \${$name}" + .($p->hasDefaultValue() ? ' = '.VarExporter::export($p->getDefaultValue()) : '') + ." {\n"; foreach ($p->getHooks() as $hook => $method) { if ('get' === $hook) { 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/LegacyLazyGhostTraitTest.php b/src/Symfony/Component/VarExporter/Tests/LegacyLazyGhostTraitTest.php index 13b0320340e17..c650626847055 100644 --- a/src/Symfony/Component/VarExporter/Tests/LegacyLazyGhostTraitTest.php +++ b/src/Symfony/Component/VarExporter/Tests/LegacyLazyGhostTraitTest.php @@ -26,6 +26,7 @@ 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; /** @@ -321,6 +322,34 @@ public function testPropertyHooks() $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 */ 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/CHANGELOG.md b/src/Symfony/Component/Workflow/CHANGELOG.md index 2926da4e6428d..5a37eadfc892d 100644 --- a/src/Symfony/Component/Workflow/CHANGELOG.md +++ b/src/Symfony/Component/Workflow/CHANGELOG.md @@ -1,13 +1,18 @@ CHANGELOG ========= +7.3 +--- + + * Deprecate `Event::getWorkflow()` method + 7.1 --- * Add method `getEnabledTransition()` to `WorkflowInterface` * Automatically register places from transitions * Add support for workflows that need to store many tokens in the marking - * Add method `getName()` in event classes to build event names in subscribers + * Add method `getName()` in event classes to build event names in subscribers 7.0 --- diff --git a/src/Symfony/Component/Workflow/DataCollector/WorkflowDataCollector.php b/src/Symfony/Component/Workflow/DataCollector/WorkflowDataCollector.php index febc97585636c..0cb7e2017b957 100644 --- a/src/Symfony/Component/Workflow/DataCollector/WorkflowDataCollector.php +++ b/src/Symfony/Component/Workflow/DataCollector/WorkflowDataCollector.php @@ -88,21 +88,39 @@ public function getCallsCount(): int return $i; } + public function hash(string $string): string + { + return hash('xxh128', $string); + } + + public function buildMermaidLiveLink(string $name): string + { + $payload = [ + 'code' => $this->data['workflows'][$name]['dump'], + 'mermaid' => '{"theme": "default"}', + 'autoSync' => false, + ]; + + $compressed = zlib_encode(json_encode($payload), ZLIB_ENCODING_DEFLATE); + + $suffix = rtrim(strtr(base64_encode($compressed), '+/', '-_'), '='); + + return "https://mermaid.live/edit#pako:{$suffix}"; + } + protected function getCasters(): array { return [ ...parent::getCasters(), - TransitionBlocker::class => function ($v, array $a, Stub $s, $isNested) { - unset( - $a[\sprintf(Caster::PATTERN_PRIVATE, $v::class, 'code')], - $a[\sprintf(Caster::PATTERN_PRIVATE, $v::class, 'parameters')], - ); + TransitionBlocker::class => static function ($v, array $a, Stub $s) { + unset($a[\sprintf(Caster::PATTERN_PRIVATE, $v::class, 'code')]); + unset($a[\sprintf(Caster::PATTERN_PRIVATE, $v::class, 'parameters')]); $s->cut += 2; return $a; }, - Marking::class => function ($v, array $a, Stub $s, $isNested) { + Marking::class => static function ($v, array $a) { $a[Caster::PREFIX_VIRTUAL.'.places'] = array_keys($v->getPlaces()); return $a; @@ -110,11 +128,6 @@ protected function getCasters(): array ]; } - public function hash(string $string): string - { - return hash('xxh128', $string); - } - private function getEventListeners(WorkflowInterface $workflow): array { $listeners = []; diff --git a/src/Symfony/Component/Workflow/Debug/TraceableWorkflow.php b/src/Symfony/Component/Workflow/Debug/TraceableWorkflow.php index 6d0afd80cf620..c783e63541dd5 100644 --- a/src/Symfony/Component/Workflow/Debug/TraceableWorkflow.php +++ b/src/Symfony/Component/Workflow/Debug/TraceableWorkflow.php @@ -30,6 +30,7 @@ class TraceableWorkflow implements WorkflowInterface public function __construct( private readonly WorkflowInterface $workflow, private readonly Stopwatch $stopwatch, + protected readonly ?\Closure $disabled = null, ) { } @@ -90,6 +91,9 @@ public function getCalls(): array private function callInner(string $method, array $args): mixed { + if ($this->disabled?->__invoke()) { + return $this->workflow->{$method}(...$args); + } $sMethod = $this->workflow::class.'::'.$method; $this->stopwatch->start($sMethod, 'workflow'); diff --git a/src/Symfony/Component/Workflow/DependencyInjection/WorkflowDebugPass.php b/src/Symfony/Component/Workflow/DependencyInjection/WorkflowDebugPass.php index 634605dffa5ee..042aaba8162a8 100644 --- a/src/Symfony/Component/Workflow/DependencyInjection/WorkflowDebugPass.php +++ b/src/Symfony/Component/Workflow/DependencyInjection/WorkflowDebugPass.php @@ -31,6 +31,7 @@ public function process(ContainerBuilder $container): void ->setArguments([ new Reference("debug.{$id}.inner"), new Reference('debug.stopwatch'), + new Reference('profiler.is_disabled_state_checker', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), ]); } } diff --git a/src/Symfony/Component/Workflow/DependencyInjection/WorkflowValidatorPass.php b/src/Symfony/Component/Workflow/DependencyInjection/WorkflowValidatorPass.php new file mode 100644 index 0000000000000..60072ef0ca612 --- /dev/null +++ b/src/Symfony/Component/Workflow/DependencyInjection/WorkflowValidatorPass.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Workflow\DependencyInjection; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\LogicException; + +/** + * @author Grégoire Pineau + */ +class WorkflowValidatorPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container): void + { + foreach ($container->findTaggedServiceIds('workflow') as $attributes) { + foreach ($attributes as $attribute) { + foreach ($attribute['definition_validators'] ?? [] as $validatorClass) { + $container->addResource(new FileResource($container->getReflectionClass($validatorClass)->getFileName())); + + $realDefinition = $container->get($attribute['definition_id'] ?? throw new \LogicException('The "definition_id" attribute is required.')); + (new $validatorClass())->validate($realDefinition, $attribute['name'] ?? throw new \LogicException('The "name" attribute is required.')); + } + } + } + } +} diff --git a/src/Symfony/Component/Workflow/Event/Event.php b/src/Symfony/Component/Workflow/Event/Event.php index c3e6a6f582434..c13818b93c115 100644 --- a/src/Symfony/Component/Workflow/Event/Event.php +++ b/src/Symfony/Component/Workflow/Event/Event.php @@ -46,8 +46,13 @@ public function getTransition(): ?Transition return $this->transition; } + /** + * @deprecated since Symfony 7.3, inject the workflow in the constructor where you need it + */ public function getWorkflow(): WorkflowInterface { + trigger_deprecation('symfony/workflow', '7.3', 'The "%s()" method is deprecated, inject the workflow in the constructor where you need it.', __METHOD__); + return $this->workflow; } diff --git a/src/Symfony/Component/Workflow/Tests/DependencyInjection/WorkflowValidatorPassTest.php b/src/Symfony/Component/Workflow/Tests/DependencyInjection/WorkflowValidatorPassTest.php new file mode 100644 index 0000000000000..213e0d4d94cc3 --- /dev/null +++ b/src/Symfony/Component/Workflow/Tests/DependencyInjection/WorkflowValidatorPassTest.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Workflow\Tests\DependencyInjection; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Workflow\Definition; +use Symfony\Component\Workflow\DependencyInjection\WorkflowValidatorPass; +use Symfony\Component\Workflow\Validator\DefinitionValidatorInterface; +use Symfony\Component\Workflow\WorkflowInterface; + +class WorkflowValidatorPassTest extends TestCase +{ + private ContainerBuilder $container; + private WorkflowValidatorPass $compilerPass; + + protected function setUp(): void + { + $this->container = new ContainerBuilder(); + $this->compilerPass = new WorkflowValidatorPass(); + } + + public function testNothingToDo() + { + $this->compilerPass->process($this->container); + + $this->assertFalse(DefinitionValidator::$called); + } + + public function testValidate() + { + $this + ->container + ->register('my.workflow', WorkflowInterface::class) + ->addTag('workflow', [ + 'definition_id' => 'my.workflow.definition', + 'name' => 'my.workflow', + 'definition_validators' => [DefinitionValidator::class], + ]) + ; + + $this + ->container + ->register('my.workflow.definition', Definition::class) + ->setArguments([ + '$places' => [], + '$transitions' => [], + ]) + ; + + $this->compilerPass->process($this->container); + + $this->assertTrue(DefinitionValidator::$called); + } +} + +class DefinitionValidator implements DefinitionValidatorInterface +{ + public static bool $called = false; + + public function validate(Definition $definition, string $name): void + { + self::$called = true; + } +} 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 18cbaf0dd979e..48e2209f2ac03 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/Workflow/composer.json b/src/Symfony/Component/Workflow/composer.json index 44a300057c04b..3e2c50a38cffd 100644 --- a/src/Symfony/Component/Workflow/composer.json +++ b/src/Symfony/Component/Workflow/composer.json @@ -20,15 +20,17 @@ } ], "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "2.5|^3" }, "require-dev": { "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", "symfony/error-handler": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", "symfony/security-core": "^6.4|^7.0", "symfony/stopwatch": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0" diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index bfa910c745b1c..3a0889a5090b3 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -750,7 +750,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/Tests/DumperTest.php b/src/Symfony/Component/Yaml/Tests/DumperTest.php index cb163b677fff0..e937336ca4858 100644 --- a/src/Symfony/Component/Yaml/Tests/DumperTest.php +++ b/src/Symfony/Component/Yaml/Tests/DumperTest.php @@ -918,7 +918,7 @@ public function testCanForceQuotesOnValues(array $input, string $expected) $this->assertSame($expected, $this->dumper->dump($input, 0, 0, Yaml::DUMP_FORCE_DOUBLE_QUOTES_ON_VALUES)); } - public function getForceQuotesOnValuesData(): iterable + public static function getForceQuotesOnValuesData(): iterable { yield 'empty string' => [ ['foo' => ''], diff --git a/src/Symfony/Component/Yaml/Tests/ParserTest.php b/src/Symfony/Component/Yaml/Tests/ParserTest.php index 94dee8f0216bf..836ec23ffa582 100644 --- a/src/Symfony/Component/Yaml/Tests/ParserTest.php +++ b/src/Symfony/Component/Yaml/Tests/ParserTest.php @@ -1804,7 +1804,7 @@ public function testParseMultiLineUnquotedStringWithTrailingComment(string $yaml $this->assertSame($expected, $this->parser->parse($yaml)); } - public function unquotedStringWithTrailingComment() + public static function unquotedStringWithTrailingComment() { return [ 'comment after comma' => [ diff --git a/src/Symfony/Contracts/HttpClient/ResponseInterface.php b/src/Symfony/Contracts/HttpClient/ResponseInterface.php index a4255903efda9..44611cd8b9b17 100644 --- a/src/Symfony/Contracts/HttpClient/ResponseInterface.php +++ b/src/Symfony/Contracts/HttpClient/ResponseInterface.php @@ -36,7 +36,7 @@ public function getStatusCode(): int; * * @param bool $throw Whether an exception should be thrown on 3/4/5xx status codes * - * @return string[][] The headers of the response keyed by header names in lowercase + * @return array> The headers of the response keyed by header names in lowercase * * @throws TransportExceptionInterface When a network error occurs * @throws RedirectionExceptionInterface On a 3xx when $throw is true and the "max_redirects" option has been reached 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;