Mercurial > hg > isophonics-drupal-site
diff core/scripts/update-countries.sh @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/scripts/update-countries.sh Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,99 @@ +#!/bin/php +<?php + +/** + * @file + * Updates CLDR codes in CountryManager.php to latest data. + * + * We rely on the CLDR data set, because it is easily accessible, scriptable, + * and in the right human-readable format. + */ + +// Determine DRUPAL_ROOT. +$dir = dirname(__FILE__); +while (!defined('DRUPAL_ROOT')) { + if (is_dir($dir . '/core')) { + define('DRUPAL_ROOT', $dir); + } + $dir = dirname($dir); +} + +// Determine source data file URI to process. +$uri = DRUPAL_ROOT . '/territories.json'; + +if (!file_exists($uri)) { + $usage = <<< USAGE +- Choose the latest release data from http://cldr.unicode.org/index/downloads + and download the json.zip file. +- Unzip the json.zip file and place the main/en/territories.json in the + Drupal root directory. +- Run this script. +USAGE; + exit('CLDR data file not found. (' . $uri . ")\n\n" . $usage . "\n"); +} + +// Fake the t() function used in CountryManager.php instead of attempting a full +// Drupal bootstrap of core/includes/bootstrap.inc (where t() is declared). +if (!function_exists('t')) { + function t($string) { + return $string; + } +} + +// Read in existing codes. +// @todo Allow to remove previously existing country codes. +// @see https://www.drupal.org/node/1436754 +require_once DRUPAL_ROOT . '/core/lib/Drupal/Core/Locale/CountryManagerInterface.php'; +require_once DRUPAL_ROOT . '/core/lib/Drupal/Core/Locale/CountryManager.php'; +$existing_countries = \Drupal\Core\Locale\CountryManager::getStandardList(); +$countries = $existing_countries; + +// Parse the source data into an array. +$data = json_decode(file_get_contents($uri)); + +foreach ($data->main->en->localeDisplayNames->territories as $code => $name) { + // Use any alternate codes the Drupal community wishes to. + $alt_codes = array( + // 'CI-alt-variant', // Use CI-alt-variant instead of the CI entry. + ); + if (in_array($code, $alt_codes)) { + // Just use the first 2 character part of the alt code. + $code = strtok($code, '-'); + } + + // Skip any codes we wish to exclude from our country list. + $exclude_codes = array( + 'EU', // The European Union is not a country. + 'ZZ', // Don't allow "Unknown Region". + ); + if (in_array($code, $exclude_codes)) { + continue; + } + + // Ignore every territory that doesn't have a 2 character code. + if (strlen($code) !== 2) { + continue; + } + $countries[(string) $code] = $name; +} +if (empty($countries)) { + echo 'ERROR: Did not find expected country names.' . PHP_EOL; + exit; +} +// Sort by country code (to minimize diffs). +ksort($countries); + +// Produce PHP code. +$out = ''; +foreach ($countries as $code => $name) { + // For .po translation file's sake, use double-quotes instead of escaped + // single-quotes. + $name = (strpos($name, '\'') !== FALSE ? '"' . $name . '"' : "'" . $name . "'"); + $out .= ' ' . var_export($code, TRUE) . ' => t(' . $name . '),' . "\n"; +} + +// Replace the actual PHP code in standard.inc. +$file = DRUPAL_ROOT . '/core/lib/Drupal/Core/Locale/CountryManager.php'; +$content = file_get_contents($file); +$content = preg_replace('/(\$countries = array\(\n)(.+?)(^\s+\);)/ms', '$1' . $out . '$3', $content); +file_put_contents($file, $content);