123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #!/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.
- */
- use Drupal\Core\Locale\CountryManager;
- // 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 = 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 = [
- // '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 = [
- // The European Union is not a country.
- 'EU',
- // Don't allow "Unknown Region".
- 'ZZ',
- ];
- 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 = \[\n)(.+?)(^\s+\];)/ms', '$1' . $out . '$3', $content, -1, $count);
- file_put_contents($file, $content);
|