In this section, we will explore how can we add a new country to Magento2? However, there are all countries listed in Magneto 2 however, there are a few islands that are not listed. It’s important to have them on the country list so the product can be delivered worldwide.

First of all create a module, let’s start with the registration.php file. Create app/code/WebbyTroops/NewCountry/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'WebbyTroops_NewCountry',
    __DIR__
);

Create a file at app/code/WebbyTroops/NewCountry/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="WebbyTroops_NewCountry" >
        <sequence>
            <module name="Magento_Directory"/>
        </sequence>
    </module>
</config>

Add the new country code in database, for that we need to create a file in app/code/WebbyTroops/NewCountry/Setup/Patch/Data/NewIreland.php

<?php

namespace WebbyTroops\NewCountry\Setup\Patch\Data;

use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Framework\Setup\Patch\PatchVersionInterface;

/**
 * Class AddDataForNorthernIreland
 */
class NewIreland implements DataPatchInterface, PatchVersionInterface {

    /**
     * @var ModuleDataSetupInterface
     */
    private $moduleDataSetup;

    /**
     * @param ModuleDataSetupInterface $moduleDataSetup
     */
    public function __construct(
            ModuleDataSetupInterface $moduleDataSetup
    ) {
        $this->moduleDataSetup = $moduleDataSetup;
    }

    /**
     * {@inheritdoc}
     */
    public function apply() {
        /**
         * Fill table directory/country
         */
        $data = [
            ['BQ', 'BQ', 'BES'] //iso3_code ???
        ];

        $columns = ['country_id', 'iso2_code', 'iso3_code'];
        $this->moduleDataSetup->getConnection()->insertArray(
                $this->moduleDataSetup->getTable('directory_country'),
                $columns,
                $data
        );
    }

    /**
     * {@inheritdoc}
     */
    public static function getDependencies() {
        return [];
    }

    /**
     * {@inheritdoc}
     */
    public static function getVersion() {
        return '2.3.3';
    }

    /**
     * {@inheritdoc}
     */
    public function getAliases() {
        return [];
    }

}

Create a new file di.xml at app/code/WebbyTroops/NewCountry/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Locale\TranslatedLists">
        <plugin name="webbyTroops_newcountry" type="WebbyTroops\NewCountry\Plugin\Framework\Locale\TranslatedListsPlugin"/>
    </type>
</config>

Create file for plugin at app/code/WebbyTroops/NewCountry/Plugin/Framework/Locale/TranslatedListsPlugin.php

<?php

namespace WebbyTroops\NewCountry\Plugin\Framework\Locale;

use Magento\Framework\Locale\ListsInterface;

/**
 * @inheritdoc
 */
class TranslatedListsPlugin
{
    /**
     * @inheritdoc
     */
    public function aroundGetCountryTranslation(
        ListsInterface $subject,
        callable $proceed,
        $value,
        $locale = null
    ) {
        if ($value == 'BQ') {
            /* need to add $locale selector */
            return 'Bonaire, Sint Eustatius and Saba';
        }
        return $proceed($value, $locale);
    }
}

At the last the general deploy commands that require to run in the following sequence:

php bin/magento setup:upgrade;
php bin/magento setup:di:compile;
php bin/magento cache:flush;

That’s all. In backend Store > Configuration > General > General > Country Options you require to select this new country in the Allowed Country options.