prinsfrank/standards

A collection of standards as PHP Enums: ISO3166, ISO4217, ISO639...

Maintainers

๐Ÿ‘ PrinsFrank

Package info

github.com/PrinsFrank/standards

pkg:composer/prinsfrank/standards

Fund package maintenance!

PrinsFrank

Statistics

Installs: 895โ€‰912

Dependents: 16

Suggesters: 0

Stars: 483

Open Issues: 0

v3.16.5 2026-06-10 20:53 UTC

Requires

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT 3499c5e8b90e2d8d3bcbe1d3690eb614c93ac965


README

๐Ÿ‘ Banner

Standards

๐Ÿ‘ GitHub
๐Ÿ‘ PHP Version Support
๐Ÿ‘ Packagist Downloads
๐Ÿ‘ codecov
๐Ÿ‘ PHPStan Level

A collection of standards as PHP Enums

Daily updated from their sources, whether it is ISO or IANA directly, or a maintaining party like the SIX Group or the US Library of Congress.

This package is actively maintained. Sponsorship helps support ongoing maintenance and review of upstream changes.

Setup

Note Make sure you are running PHP 8.1 or higher to use this package

To start right away, run the following command in your composer project;

composer require prinsfrank/standards

Or for development only;

composer require prinsfrank/standards --dev

๐Ÿ’– Sponsorship

This package is regularly updated as upstream standards change. Keeping it reliable and consistent takes ongoing effort. Even though most of the standards in this package are automatically checked with upstream sources, these changes still need to be manually reviewed. When sources update the way they present their data, the parsing scripts also need to be updated.

If you depend on this package and want to support its maintenance, please consider sponsoring me. I'll continue maintaining and releasing updates regardless, but sponsorships help cover the time it takes to review changes and keep everything accurate.

Daily updated from their source

๐Ÿ‘ Country
๐Ÿ‘ Country Calling Code
๐Ÿ‘ Currency
๐Ÿ‘ EU
๐Ÿ‘ WTO
๐Ÿ‘ HTTP method
๐Ÿ‘ HTTP Status code
๐Ÿ‘ Language Extensive
๐Ÿ‘ Language
๐Ÿ‘ Language Subtag
๐Ÿ‘ PHP Regex script
๐Ÿ‘ Script
๐Ÿ‘ TLD

How this package works

This package implements a bunch of specs as PHP Enums, so you can typehint them in methods. Currently, all specs are implemented as backed enums. That means that besides a name, they have also an internal 'value', either as an integer or a string.

In the Country, Currency and language specifications, there is also a relation between different enums. For example, the Alpha2 country code 'NL' is related to the Alpha3 'NLD', the numeric value '528' and the name 'Netherlands (the)'. Internally, these specs rely on the fact that the keys for these values are identical, so it is possible to convert between these.

Entities and their relations

All specifications in this package are closely related, except for the Http status code and methods. Not all relations are bidirectional though. For example, a language tag is build up of a language and optionally a country, but only a country cannot be converted to a language tag.

Below you can find an overview of all the relationships between specifications.

erDiagram
 Country {
 class CountryAlpha2
 class CountryAlpha3
 class CountryNumeric
 class CountryName
 }
 GeographicRegion {
 class GeographicRegion
 }
 CountryGroup {
 class BRICS
 class EEA
 class EFTA
 class EU
 class EuroZone
 class NATO
 class Schengen
 class WorldTradeOrganization
 }
 CountryCallingCode {
 class CountryCallingCode
 }
 CountrySubdivision {
 class CountrySubdivision
 }
 Currency {
 class CurrencyAlpha3
 class CurrencyName
 class CurrencyNumeric
 }
 CurrencyMinorUnits {
 class CurrencyMinorLowerLastAlpha3
 class CurrencyMinorUpperXAlpha3
 }
 CurrencySymbol {
 class CurrencySymbol
 }
 NationalCallPrefix {
 class NationalCallPrefix
 }
 InternationalCallPrefix {
 class InternationalCallPrefix
 }
 Language {
 class LanguageName
 class LanguageAlpha2
 class LanguageAlpha3Common
 class LanguageAlpha3Bibliographic
 class LanguageAlpha3Terminology
 class LanguageAlpha3Extensive
 }
 Script {
 class ScriptAlias
 class ScriptCode
 class ScriptName
 class ScriptNumber
 }
 LanguageTag {
 class LanguageTag
 class LanguageTagVariant
 class PrivateUsePrimarySubtag
 class SingleCharacterSubtag
 }
 HttpMethod {
 class HtppMethod
 }
 HttpStatusCode {
 class HttpStatusCode
 }
 TLD {
 class CountryCodeTLD
 class GenericRestrictedTLD
 class GenericTLD
 class InfrastructureTLD
 class SponsoredTLD
 class TestTLD
 }

 Country ||--o{ CountrySubdivision: ""
 Country ||--o{ Country: ""
 GeographicRegion }|--o{ Country: ""
 GeographicRegion ||--o{ GeographicRegion: ""
 Language }o--o{ Country: ""
 Country }|--o{ CountryGroup: ""
 Country }|--o{ CountryCallingCode: ""
 Country }o--o{ Currency: ""
 Country }|--o{ NationalCallPrefix: ""
 Country }|--o{ InternationalCallPrefix: ""
 Currency }|--o| CurrencySymbol: ""
 Currency }|--o| CurrencyMinorUnits: ""
 LanguageTag ||--o{ LanguageTag: ""
 Language }|--o{ LanguageTag: ""
 Script |o--o{ LanguageTag: ""
 Country |o--o{ LanguageTag: ""
 TLD ||--o| Country: ""
 LanguageTag }o--o| GeographicRegion: ""
Loading

Upgrading

This package adheres to semver. This means that there are no breaking changes between minor releases (for example from 1.1 to 1.2), but that breaking changes are released as a major release (for example from 1.x to 2.x). To read about upgrading from one major release to the next, please refer to the UPGRADING.md file in the root of this project.

Some powerful use cases

Format a complete phone number string based on the users country; ๐Ÿ‘ Image

Automatically select a supported language from an HTTP request; ๐Ÿ‘ Image

Listing all country calling codes sorted by country name in a dropdown; ๐Ÿ‘ Image

Country (ISO3166-1)

๐Ÿ‘ Daily country spec update

๐ŸŽ“ Alpha2/3 country codes are always UPPERCASE to avoid confusion with language codes. It is recommended to use Alpha2/Alpha3 codes when exposing the specification in APIs

At a glance

All the Alpha2, Alpha3, Numeric and Name values have a corresponding enum in the other country enums. These can be converted using their corresponding methods (toAlpha2, toAlpha3 etc...).

Country group membership can be checked by calling the isMemberOf method, supplying the FQN of a class that implements the GroupInterface. Several country groups are available: BRICS, EEA, EFTA etc. Countries can also have subdivisions, which can be of several types: countries, provinces, etc.

use PrinsFrank\Standards\Country\CountryAlpha2;
use PrinsFrank\Standards\Country\CountryAlpha3;
use PrinsFrank\Standards\Country\CountryNumeric;
use PrinsFrank\Standards\Country\Groups\EU;
use PrinsFrank\Standards\Language\LanguageAlpha2;

CountryAlpha2::from('NL'); // CountryAlpha2::Netherlands
CountryNumeric::from('528'); // CountryNumeric::Netherlands
CountryNumeric::fromInt(528); // CountryNumeric::Netherlands
CountryAlpha3::from('NLD'); // CountryAlpha3::Netherlands
CountryAlpha3::from('NLD')->value; // 'NLD'
CountryAlpha3::from('NLD')->name; // 'Netherlands'
CountryAlpha3::from('NLD')->toCountryAlpha2()->value; // 'NL'
CountryAlpha3::from('NLD')->toCountryNumeric()->value; // '528'
CountryAlpha3::from('NLD')->toCountryNumeric()->valueAsInt(); // 528
CountryAlpha3::from('NLD')->isMemberOf(EU::class); // true
CountryAlpha2::Netherlands; // CountryAlpha2::Netherlands

CountryAlpha2::Vanuatu->getSubdivisions(); // [CountrySubdivision::Vanuatu_province_Malampa, CountrySubdivision::Vanuatu_province_Penama, CountrySubdivision::Vanuatu_province_Sanma, CountrySubdivision::Vanuatu_province_Shefa, CountrySubdivision::Vanuatu_province_Tafea, CountrySubdivision::Vanuatu_province_Torba]

CountryAlpha2::Aruba->getParentCountry(); // CountryAlpha2::Netherlands
CountryAlpha2::Netherlands->getSubCountries(); // [CountryAlpha2::Aruba, CountryAlpha2::Curacao, CountryAlpha2::Sint_Maarten_Dutch_part, CountryAlpha2::Bonaire_Sint_Eustatius_and_Saba]

CountryAlpha3::from('NLD')->getCountryCallingCodes(); // [CountryCallingCode::Netherlands_Kingdom_of_the]
CountryAlpha3::from('NLD')->getCountryCallingCodes()[0]->value ?? null; // 31

CountryAlpha3::from('NLD')->getInternationalCallPrefix(); // InternationalCallPrefix::_00
CountryAlpha3::from('NLD')->getInternationalCallPrefix()->value; // '00'

CountryAlpha3::from('NLD')->getNationalCallPrefix(); // NationalCallPrefix::_0
CountryAlpha3::from('NLD')->getNationalCallPrefix()->value; // '0'

CountryAlpha3::from('NLD')->getFlagEmoji(); // '๐Ÿ‡ณ๐Ÿ‡ฑ' (This might not be displayed correctly in this readme if you're on windows, see 'https://prinsfrank.nl/2021/01/25/Non-existing-flag-emojis-on-windows to make these flag emojis visible for Windows users.')
CountryAlpha3::from('NLD')->getCurrenciesAlpha3(); // [CurrencyAlpha3::Euro]
CountryAlpha3::from('NLD')->getOfficialAndDeFactoLanguages(); // [LanguageAlpha2::Dutch_Flemish]

CountryAlpha3::from('NLD')->getNameInLanguage(LanguageAlpha2::Dutch_Flemish); // 'Nederland'
CountryAlpha3::from('NLD')->getNameInLanguage(LanguageAlpha2::English); // 'Netherlands'

CountryAlpha3::from('NLD')->formatNumber(42.42, LanguageAlpha2::Dutch_Flemish); // '42,42'

function foo(CountryAlpha2 $countryAlpha2): void {} // Use spec as typehint to enforce valid value

Country Calling Codes (ITU-T E.164)

๐ŸŽ“ Country calling codes can be anywhere from 1 to 3 digits, and can span several countries. There are no leading zeros in this specification.

At a glance

Country calling codes are quite straight forward. One country can have multiple country calling codes though, And one country calling code can span multiple countries. That's why the forCountry and getCountriesAlpha2 both return an array of country calling codes/countries and not a single item.

use PrinsFrank\Standards\Country\CountryAlpha2;
use PrinsFrank\Standards\CountryCallingCode\CountryCallingCode;

CountryCallingCode::from(1); // CountryCallingCode::Integrated_numbering_plan
CountryCallingCode::from(31); // CountryCallingCode::Netherlands_Kingdom_of_the
CountryCallingCode::from(31)->value; // 31
CountryCallingCode::from(31)->name; // 'Netherlands_Kingdom_of_the'
CountryCallingCode::Netherlands_Kingdom_of_the; // CountryCallingCode::Netherlands_Kingdom_of_the

CountryCallingCode::from(31)->getCountriesAlpha2(); // [CountryAlpha2::Netherlands]
CountryCallingCode::from(7)->getCountriesAlpha2(); // [CountryAlpha2::Kazakhstan, CountryAlpha2::Russian_Federation]

CountryCallingCode::forCountry(CountryAlpha2::Netherlands); // [CountryCallingCode::Netherlands_Kingdom_of_the]

function foo(CountryCallingCode $countryCallingCode): void {} // Use spec as typehint to enforce valid value

Currency (ISO4217)

๐Ÿ‘ Daily currency spec update

๐ŸŽ“ Alpha3 codes are uppercase. When communicating or storing currencies, it is recommended to do so using the Alpha3 or Numeric representation.

At a glance

All the Alpha3, Numeric and Name values have a corresponding enum in the other currency enums. These can be converted using their corresponding methods (toCurrencyAlpha3, etc...). A fourth enum is available that maps all currencies to a currency symbol, that can be accessed by calling the 'getSymbol' method.

use PrinsFrank\Standards\Country\CountryAlpha2;
use PrinsFrank\Standards\Currency\CurrencyAlpha3;
use PrinsFrank\Standards\Currency\CurrencyName;
use PrinsFrank\Standards\Currency\CurrencyNumeric;
use PrinsFrank\Standards\Currency\CurrencySymbol;
use PrinsFrank\Standards\Language\LanguageAlpha2;

CurrencyAlpha3::from('EUR'); // CurrencyAlpha3::Euro
CurrencyAlpha3::from('EUR')->value; // 'EUR'
CurrencyAlpha3::from('EUR')->lowerCaseValue(); // 'eur'
CurrencyAlpha3::from('EUR')->toCurrencyName()->value; // 'Euro'
CurrencyAlpha3::from('EUR')->getSymbol(); // CurrencySymbol::Euro
CurrencyAlpha3::from('EUR')->getSymbol()?->value; // 'โ‚ฌ'
CurrencyAlpha3::from('EUR')->toCurrencyNumeric()->value; // '978'
CurrencyAlpha3::from('EUR')->getMinorUnits(); // 2
CurrencyNumeric::from('978'); // CurrencyNumeric::Euro
CurrencyNumeric::fromInt(978); // CurrencyNumeric::Euro
CurrencyNumeric::from('978')->value; // '978'
CurrencyNumeric::from('978')->valueAsInt(); // 978
CurrencySymbol::from('โ‚ฌ'); // CurrencySymbol::Euro
CurrencySymbol::from('โ‚ฌ')->value; // 'โ‚ฌ'
CurrencySymbol::forCurrency(CurrencyAlpha3::Euro); // CurrencySymbol::Euro
CurrencySymbol::forCurrency(CurrencyNumeric::Euro); // CurrencySymbol::Euro
CurrencySymbol::forCurrency(CurrencyName::Euro); // CurrencySymbol::Euro
CurrencySymbol::forCurrency(CurrencyNumeric::from('978')); // CurrencySymbol::Euro
CurrencyAlpha3::Euro; // CurrencyAlpha3::Euro

CurrencyAlpha3::Euro->format(42.42, LanguageAlpha2::Dutch_Flemish); // 'โ‚ฌ 42,42'
CurrencyAlpha3::Euro->format(42.42, LanguageAlpha2::Dutch_Flemish, CountryAlpha2::Netherlands); // 'โ‚ฌ 42,42'

CurrencyAlpha3::Norwegian_Krone->getCountriesAlpha2(); // [CountryAlpha2::Bouvet_Island, CountryAlpha2::Norway, CountryAlpha2::Svalbard_Jan_Mayen]

function foo(CurrencyAlpha3 $currencyAlpha3): void {} // Use spec as typehint to enforce valid value

HTTP Methods

๐Ÿ‘ Daily HTTP method spec update

At a glance

use PrinsFrank\Standards\Http\HttpMethod;

HttpMethod::from('POST'); // HttpMethod::Post
HttpMethod::from('POST')->value; // 'POST'
HttpMethod::from('POST')->name; // Post
HttpMethod::Post; // HttpMethod::Post

function foo(HttpMethod $httpMethod): void {} // Use spec as typehint to enforce valid value

HTTP Status Codes

๐Ÿ‘ Daily HTTP Status code spec update

At a glance

use PrinsFrank\Standards\Http\HttpStatusCode;

HttpStatusCode::from(404); // HttpStatusCode::Not_Found
HttpStatusCode::from(404)->value; // 404
HttpStatusCode::from(404)->name; // Not_Found
HttpStatusCode::Not_Found; // HttpStatusCode::Not_Found

function foo(HttpStatusCode $httpStatusCode): void {} // Use spec as typehint to enforce valid value

There can be status codes that are temporarily assigned. Those are marked with the TemporaryAssignment attribute. To check if a specific case is temporarily assigned, you can use the isTemporaryAssignment method which returns a boolean, or getTemporaryAssignmentExpiresAt which returns a DateTimeImmutable or null.

International Call Prefixes (ITU-T E.164)

Different countries have different international call prefixes. This is a spec extracted from ITU-T E.164 listing all possible international call prefixes.

At a glance

use PrinsFrank\Standards\InternationalCallPrefix\InternationalCallPrefix;
use PrinsFrank\Standards\Country\CountryAlpha2;
use PrinsFrank\Standards\Country\CountryAlpha3;
use PrinsFrank\Standards\Country\CountryName;
use PrinsFrank\Standards\Country\CountryNumeric;

InternationalCallPrefix::from('0'); // InternationalCallPrefix::_0
InternationalCallPrefix::from('0')->value; // '0'
InternationalCallPrefix::from('0')->name; // '_0'
InternationalCallPrefix::_0; // InternationalCallPrefix::_0
InternationalCallPrefix::_0->getCountriesAlpha2(); // [CountryAlpha2::Samoa]

InternationalCallPrefix::forCountry(CountryAlpha2::Netherlands); // InternationalCallPrefix::_00
InternationalCallPrefix::forCountry(CountryAlpha3::Netherlands); // InternationalCallPrefix::_00
InternationalCallPrefix::forCountry(CountryNumeric::Netherlands); // InternationalCallPrefix::_00
InternationalCallPrefix::forCountry(CountryName::Netherlands); // InternationalCallPrefix::_00

function foo(InternationalCallPrefix $internationalCallPrefix): void {} // Use spec as typehint to enforce valid value

Language (ISO639)

๐Ÿ‘ Daily language spec update
๐Ÿ‘ Daily Language Extensive update

๐ŸŽ“ Language codes are always in lowercase to avoid confusion with country codes.

๐ŸŽ“ The alpha2 specification has 184 languages, the alpha3 Bibliographic/Terminology specification has 486 languages and the alpha3 Extensive specification has 7908 languages.

๐ŸŽ“ If you have to choose between the alpha3 Bibliographic and Terminology specification, the Terminology specification is more widely used.

At a glance

There are four language code specifications:

  • 184 Language Alpha2 (ISO 639-1)
  • 486 Language Alpha3 Bibliographic (ISO 639-2)
  • 486 Language Alpha3 Terminology (ISO 639-2)
  • 7908 Language Alpha3 Extensive (ISO 639-3)

As you see, the Bibliographic and Terminology specifications have an identical number of languages, so there is a one-to-one relation between these.

use PrinsFrank\Standards\Language\LanguageAlpha2;
use PrinsFrank\Standards\Language\LanguageAlpha3Bibliographic;
use PrinsFrank\Standards\Language\LanguageAlpha3Terminology;
use PrinsFrank\Standards\Language\LanguageAlpha3Extensive;

LanguageAlpha2::from('nl'); // LanguageAlpha2::Dutch_Flemish
LanguageAlpha2::from('nl')->value; // 'nl'
LanguageAlpha2::from('nl')->name; // 'Dutch_Flemish'
LanguageAlpha2::from('nl')->toLanguageAlpha3Bibliographic(); // LanguageAlpha3Bibliographic::Dutch_Flemish
LanguageAlpha2::from('nl')->toLanguageAlpha3Bibliographic()?->value; // 'dut'
LanguageAlpha2::from('nl')->toLanguageAlpha3Terminology(); // LanguageAlpha3Terminology::Dutch_Flemish
LanguageAlpha2::from('nl')->toLanguageAlpha3Terminology()?->value; // 'nld'
LanguageAlpha2::from('nl')->toLanguageName()->value; // 'Dutch; Flemish'

LanguageAlpha3Terminology::from('nld'); // LanguageAlpha3Terminology::Dutch_Flemish
LanguageAlpha3Bibliographic::from('dut'); // LanguageAlpha3Bibliographic::Dutch_Flemish

LanguageAlpha3Extensive::from('nld'); // LanguageAlpha3Extensive::Dutch
LanguageAlpha3Extensive::from('dse'); // LanguageAlpha3Extensive::Dutch_Sign_Language

LanguageAlpha2::Dutch_Flemish->getNameInLanguage(LanguageAlpha2::Dutch_Flemish); // 'Nederlands'
LanguageAlpha2::Dutch_Flemish->getNameInLanguage(LanguageAlpha2::English); // 'Dutch'

function foo(LanguageAlpha2 $languageAlpha2): void {} // Use spec as typehint to enforce valid value

Language Tags (RFC 5646)

:mortar-board: Language tags always have a primary tag, and can have an extension, script, region, one or more variants, one or more extension and/or a private subtag.

At a glance

use PrinsFrank\Standards\Country\CountryAlpha2;
use PrinsFrank\Standards\Language\LanguageAlpha2;
use PrinsFrank\Standards\LanguageTag\LanguageTag;
use PrinsFrank\Standards\LanguageTag\LanguageTagVariant;

LanguageTag::tryFromString(''); // null
LanguageTag::fromString('foo'); // InvalidArgumentException
LanguageTag::fromString('nl'); // LanguageTag(LanguageAlpha2::Dutch_Flemish);
LanguageTag::fromString('i-enochian'); // LanguageTag(SingleCharacterSubtag::GRANDFATHERED, privateUseSubtag: 'enochian')
LanguageTag::fromString('zh-Hant'); // LanguageTag(LanguageAlpha2::Chinese, script: ScriptSubtag::Han_Traditional_variant)
LanguageTag::fromString('sr-Cyrl'); // LanguageTag(LanguageAlpha2::Serbian, scriptSubtag: ScriptCode::Cyrillic)
LanguageTag::fromString('zh-cmn-Hans-CN'); // LanguageTag(LanguageAlpha2::Chinese, LanguageAlpha3Extensive::Mandarin_Chinese, ScriptCode::Han_Simplified_variant, CountryAlpha2::China)
LanguageTag::fromString('sl-rozaj-biske'); // LanguageTag(LanguageAlpha2::Slovenian, variantSubtag: [LanguageTagVariant::Rezijan, LanguageTagVariant::The_Bila_dialect_of_Resian])
LanguageTag::fromString('de-CH-1901'); // LanguageTag(LanguageAlpha2::German, regionSubtag: CountryAlpha2::Switzerland, variantSubtag: [LanguageTagVariant::Traditional_German_orthography])

LanguageTag::fromString('de-CH-1901')->primaryLanguageSubtag; // LanguageAlpha2::German
LanguageTag::fromString('de-CH-1901')->regionSubtag; // CountryAlpha2::Switzerland

LanguageAlpha2::Dutch_Flemish->toLanguageTag(); // 'nl'
LanguageAlpha2::German->toLanguageTag(regionSubtag: CountryAlpha2::Switzerland, variantSubtag: [LanguageTagVariant::Traditional_German_orthography]); // 'de-CH-1901'

function foo(LanguageTag $languageTag): void {} // Use spec as typehint to enforce valid value

Geographic regions (M49)

๐ŸŽ“ Geographic regions are represented by three digits. Leading zeros are required. Each geographic region can span multiple other geographic regions or countries.

At a glance

use PrinsFrank\Standards\Region\GeographicRegion;

GeographicRegion::from('150'); // GeographicRegion::Europe
GeographicRegion::from('150')->value; // '150'
GeographicRegion::from('150')->name; // Europe
GeographicRegion::Europe; // GeographicRegion::Europe

GeographicRegion::from('150')->getDirectSubRegions(); // [GeographicRegion::Eastern_Europe, GeographicRegion::Northern_Europe, ...]
GeographicRegion::from('150')->getAllSubRegions(); // [GeographicRegion::Eastern_Europe, GeographicRegion::Northern_Europe, ...]

GeographicRegion::from('150')->getDirectSubCountries(); // []
GeographicRegion::from('150')->getAllSubCountries(); // [CountryNumeric::Belarus, CountryNumeric::Bulgaria, ...]

function foo(GeographicRegion $geographicRegion): void {} // Use spec as typehint to enforce valid value

National Call Prefixes (ITU-T E.164)

Different countries have different national call prefixes;

At a glance

use PrinsFrank\Standards\NationalCallPrefix\NationalCallPrefix;
use PrinsFrank\Standards\Country\CountryAlpha2;
use PrinsFrank\Standards\Country\CountryAlpha3;
use PrinsFrank\Standards\Country\CountryNumeric;
use PrinsFrank\Standards\Country\CountryName;

NationalCallPrefix::from('0'); // NationalCallPrefix::_0
NationalCallPrefix::from('0')->value; // '0'
NationalCallPrefix::from('0')->name; // '_0'
NationalCallPrefix::_0; // NationalCallPrefix::_0

NationalCallPrefix::forCountry(CountryAlpha2::Netherlands); // NationalCallPrefix::_0
NationalCallPrefix::forCountry(CountryAlpha3::Netherlands); // NationalCallPrefix::_0
NationalCallPrefix::forCountry(CountryNumeric::Netherlands); // NationalCallPrefix::_0
NationalCallPrefix::forCountry(CountryName::Netherlands); // NationalCallPrefix::_0

function foo(NationalCallPrefix $nationalCallPrefix): void {} // Use spec as typehint to enforce valid value

Scripts

๐Ÿ‘ Daily Script spec update

At a glance

use PrinsFrank\Standards\Scripts\ScriptAlias;
use PrinsFrank\Standards\Scripts\ScriptCode;
use PrinsFrank\Standards\Scripts\ScriptName;
use PrinsFrank\Standards\Scripts\ScriptNumber;

ScriptAlias::from('Latin'); // ScriptAlias::Latin
ScriptAlias::from('Latin')->value; // 'Latin'
ScriptAlias::from('Latin')->name; // 'Latin'
ScriptAlias::Latin; // ScriptAlias::Latin
ScriptAlias::from('Latin')->toScriptCode(); // ScriptCode::Latin
ScriptCode::from('Latn'); // ScriptCode::Latin
ScriptName::from('Latin'); // ScriptName::Latin
ScriptNumber::from('215'); // ScriptNumber::Latin

ScriptAlias::Latin->isSupportedByPHPRegex(); // true
ScriptAlias::allForString('ะตัŽeuะตัŽฮตฯ…'); // [ScriptAlias::Cyrillic, ScriptAlias::Greek, ScriptAlias::Latin]
ScriptAlias::hasMultipleForString('ะตัŽeuะตัŽฮตฯ…'); // true
ScriptAlias::mostCommonInString('ะตัŽeuะตัŽฮตฯ…'); // ScriptAlias::Cyrillic

function foo(ScriptAlias $scriptAlias): void {} // Use spec as typehint to enforce valid value

TLDs

๐Ÿ‘ Daily TLD spec update

There are currently 6 types of Top Level Domains:

  • CountryCode
  • GenericRestricted
  • Generic
  • Infrastructure
  • Sponsored
  • Test

Most of these specification have several TLDs that are 'unmanaged' and are thus not currently available. Those are marked as deprecated, but are kept in the specification. There is one exception: All Test TLDs are always unmanaged and are thus never marked as deprecated.

CountryCodeTLD

Where a TLD is marked as unmanaged by IANA it is marked as deprecated.

use PrinsFrank\Standards\TopLevelDomain\CountryCodeTLD;

CountryCodeTLD::from('nl'); // CountryCodeTLD::nl
CountryCodeTLD::nl; // CountryCodeTLD::nl
CountryCodeTLD::from('nl')->value; // 'nl'
CountryCodeTLD::from('nl')->name; // 'nl'
CountryCodeTLD::from('nl')->isAssigned(); // true
CountryCodeTLD::from('nl')->getCountryAlpha2(); // CountryAlpha2::Netherlands
CountryCodeTLD::from('nl')->getCountryAlpha3(); // CountryAlpha3::Netherlands
CountryCodeTLD::from('nl')->getCountryNumeric(); // CountryNumeric::Netherlands

function foo(CountryCodeTLD $countryCodeTLD): void {} // Use spec as typehint to enforce valid value

GenericRestrictedTLD

Where a TLD is marked as unmanaged by IANA it is marked as deprecated.

use PrinsFrank\Standards\TopLevelDomain\GenericRestrictedTLD;

GenericRestrictedTLD::from('name'); // GenericRestrictedTLD::name
GenericRestrictedTLD::name; // GenericRestrictedTLD::name
GenericRestrictedTLD::from('name')->value; // 'name'
GenericRestrictedTLD::from('name')->name; // 'name'
GenericRestrictedTLD::from('name')->isAssigned(); // true

function foo(GenericRestrictedTLD $genericRestrictedTLD): void {} // Use spec as typehint to enforce valid value

GenericTLD

Where a TLD is marked as unmanaged by IANA it is marked as deprecated.

use PrinsFrank\Standards\TopLevelDomain\GenericTLD;

GenericTLD::from('aaa'); // GenericTLD::aaa
GenericTLD::aaa; // GenericTLD::aaa
GenericTLD::from('aaa')->value; // 'aaa'
GenericTLD::from('aaa')->name; // 'aaa'
GenericTLD::from('aaa')->isAssigned(); // true

function foo(GenericTLD $genericTLD): void {} // Use spec as typehint to enforce valid value

InfrastructureTLD

Where a TLD is marked as unmanaged by IANA it is marked as deprecated.

use PrinsFrank\Standards\TopLevelDomain\InfrastructureTLD;

InfrastructureTLD::from('arpa'); // InfrastructureTLD::arpa
InfrastructureTLD::arpa; // InfrastructureTLD::arpa
InfrastructureTLD::from('arpa')->value; // 'arpa'
InfrastructureTLD::from('arpa')->name; // 'arpa'
InfrastructureTLD::from('arpa')->isAssigned(); // true

function foo(InfrastructureTLD $infrastructureTLD): void {} // Use spec as typehint to enforce valid value

SponsoredTLD

Where a TLD is marked as unmanaged by IANA it is marked as deprecated.

use PrinsFrank\Standards\TopLevelDomain\SponsoredTLD;

SponsoredTLD::from('aero'); // SponsoredTLD::aero
SponsoredTLD::aero; // SponsoredTLD::aero
SponsoredTLD::from('aero')->value; // 'aero'
SponsoredTLD::from('aero')->name; // 'aero'
SponsoredTLD::from('aero')->isAssigned(); // true

function foo(SponsoredTLD $sponsoredTLD): void {} // Use spec as typehint to enforce valid value

TestTLD

All Test TLDs are always unmanaged and are thus never marked as deprecated.

use PrinsFrank\Standards\TopLevelDomain\TestTLD;

TestTLD::from('ใƒ†ใ‚นใƒˆ'); // TestTLD::tesuto_katakana
TestTLD::tesuto_katakana; // TestTLD::tesuto_katakana
TestTLD::from('ใƒ†ใ‚นใƒˆ')->value; // 'ใƒ†ใ‚นใƒˆ'
TestTLD::from('ใƒ†ใ‚นใƒˆ')->name; // 'tesuto_katakana'
TestTLD::from('ใƒ†ใ‚นใƒˆ')->isAssigned(); // false

function foo(TestTLD $testTLD): void {} // Use spec as typehint to enforce valid value