Details
Description
An internationalized domain name (IDN) is an Internet domain name that contains at least one label displayed in software applications, in whole or in part, in non-Latin script or alphabet or in the Latin alphabet-based characters with diacritics or ligatures. These writing systems are encoded by computers in multibyte Unicode. Internationalized domain names are stored in the Domain Name System (DNS) as ASCII strings using Punycode transcription. Internationalized Domain Name
International Domain Names (IDN) include multibyte Unicode characters, so non-ASCII characters. IDNs can be converted to a ASCII notation which is known as Punycode. In the User Interface of Applications, domains are shown in their unicode format, but in the background the punycode notation has to be used which means in DB Processing, Provider communication (e.g. Domain Registrar APIs) et al.
The punycode variant of a non-IDN domain matches with the domain name e.g. mydomain.com (domain name) = mydomain.com (punycode) as there are no unicode characters involved. By that you can easily identify if the domain name is a IDN or not.
We use Punycode formatted IDN domains to:
- Store IDN domains in the database
- Interact with a registrar's API
As an example:
IDN domain: (SEE ATTACHMENT, CANNOT USE CHARACTERS IN JIRA)
Punycode of domain: xn--80aq1ac.org
We will need to update at least 2 plugins:
- Domain Manager
- Order Plugin
It should be possible to search for an IDN domain by entering either the Punycode Variant, or the IDN/Unicode one.
We need to convert IDN formatted domains to Punycode for the purpose of searching for, registering, and managing a domain, if it is provided in the non-English IDN format. We will store the Punycode formatted IDN domain in the database.
We need to convert a Puncycode domain to IDN format for display within Blesta where domains are shown (Domains widget, order form). This can be done on the fly with a Javascript library.
Someone has suggested the following libraries:
PHP Library
https://github.com/centralnicgroup-opensource/rtldev-middleware-php-idna-translator/blob/main/README.md
JavaScript Library
https://github.com/centralnicgroup-opensource/rtldev-middleware-idna-uts46/blob/master/README.md
Example using the JavaScript library:
HTML Code example:
<domain label="xn--80aq1ac.org"></domain>
The library ill update this automatically to:
<domain label="xn--80aq1ac.org">(SEE ATTACHMENT, CANNOT USE CHARACTERS IN JIRA)</domain>
See Ticket #7764780 for more details from the customer that recommended these libraries, and more regarding IDN.
Many domain registrar's already support IDNs, so it's likely we won't need to make many, if any changes to existing domain registrars.
It's possible there may be some registrars that require the IDN and not Punycode, so we may wish to pass a flag to the registrar to indicate whether it is_idn (true/false), and it if is an IDN domain, include both the Punycode and IDN language for the domain. This will allow the registrar module to use the version of the domain that it's API expects. Most support Punycode, but there may be some that do not.. so if is_idn=true, the included IDN language of the domain can be used instead of the Punycode version of the domain. Since we will always store Punycode, we will need to convert this when interacting with the module if is_idn=true, and the standard field that we store a domain in now will continue to be used, with a new domain field for the IDN language, if it exists... if we use "domain" for domains now, this would include Punycode for IDN domains, and we can use something else like domain_idn for the IDN language. If the module needs it, it has it.