• 2012-03-05 12:00:00

    Localization and Country Regions

    I was recently assigned a task in my current job, to try and standardize address related data.

    My approach was to use the ISO codes for countries and ISO codes for regions. A region is defined as the geographical split of areas in a country. For instance in the US regions are called states, in Canada provinces etc.

    I have used several sources on the internet but my main source was Wikipedia.

    In order to complete this task I used Zend Locale to retrieve the available countries and using the ISO codes (keys of the returned data).

    My method is:

    /**
     * Gets the countries based on a passed (or default) locale
     * 
     * @param string  $locale
     * @param boolean  $sort
     */
    public static function getCountries($locale = NULL, $sort = TRUE)
    {
        $results = parent::getTranslationList('territory', $locale, 2);
    
        if ($sort) 
        {
            asort($results);
        }
    
        return $results;
    }
    

    Having the list of countries and their ISO codes, allowed me to have a proper storage of country related data in my addresses table. The use of a select box in the view layer ensures that I keep this standardization in place.

    Extending that, I wanted to have an easy way to access the region related data, without having to hit the database. I therefore used JSON encoded files that contain an array with the type of the region as the key and Region ISO Code => Region Name as the array elements. Again I used a select box for that in the view layer, which is automatically refreshed when a new country is selected.

    So for instance for the US the JSON file is as follows:

    {
        "state":{
            "US-AL":"Alabama",
            "US-AK":"Alaska",
            ...
            "US-WV":"West Virginia",
            "US-WI":"Wisconsin",
            "US-WY":"Wyoming"
        }
    }
    

    where the key defines the region - in this case a State, and the array elements are the relevant data. In some instances I wanted to give a bit more selection and visual aids to the end user. I therefore have several sub arrays denoted by optiongroup tags for the relevant select box showing the regions.

    In the case of Great Britain:

    {
        "county":{
            "England":{
                "GB-BKM":"Buckinghamshire",
                "GB-CAM":"Cambridgeshire",
                ...
                "GB-WOK":"Wokingham",
                "GB-YOR":"York"
            },
            "Northern Ireland":{
                "GB-ANT":"Antrim",
                "GB-ARD":"Ards",
                ...
                "GB-OMH":"Omagh",
                "GB-STB":"Strabane"
            },
            "Scotland":{
                "GB-ABE":"Aberdeen City",
                "GB-ABD":"Aberdeenshire",
                ...
                "GB-WDU":"West Dunbartonshire",
                "GB-WLN":"West Lothian"
            },
            "Wales":{
                "GB-BGW":"Blaenau Gwent",
                "GB-BGE":"Bridgend (Pen-y-bont ar Ogwr)",
                ...
                "GB-VGL":"Vale of Glamorgan (Bro Morgannwg)",
                "GB-WRX":"Wrexham (Wrecsam)"
            }
        }
    }
    

    So with simple commands as file_get_contents and json_decode (or using Zend_Json::decode) I was able to have a flexible system that would load standardized address related data (regions and countries).

    You can download the list of JSON files (one per country) from my Github Repo.

    The list I have there is by no means complete, but it does have a lot of data that one can use. Additions are always welcome :)

    Enjoy!