105 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								#!/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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// cspell:ignore localenames
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 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
							 | 
						||
| 
								 | 
							
								- Download territories.json from
							 | 
						||
| 
								 | 
							
								  https://github.com/unicode-org/cldr-json/blob/main/cldr-json/cldr-localenames-full/main/en/territories.json
							 | 
						||
| 
								 | 
							
								  and place it in the Drupal root directory.
							 | 
						||
| 
								 | 
							
								- Run this script.
							 | 
						||
| 
								 | 
							
								USAGE;
							 | 
						||
| 
								 | 
							
								  exit('CLDR data file not found. (' . $uri . ")\n\n" . $usage . "\n");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 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',
							 | 
						||
| 
								 | 
							
								    // The Eurozone is not a country.
							 | 
						||
| 
								 | 
							
								    'EZ',
							 | 
						||
| 
								 | 
							
								    // The United Nations is not a country.
							 | 
						||
| 
								 | 
							
								    'UN',
							 | 
						||
| 
								 | 
							
								    // "Pseudo-Accents" is not a country.
							 | 
						||
| 
								 | 
							
								    'XA',
							 | 
						||
| 
								 | 
							
								    // "Pseudo-Bidi" is not a country.
							 | 
						||
| 
								 | 
							
								    'XB',
							 | 
						||
| 
								 | 
							
								    // 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 = str_contains($name, '\'' ? '"' . $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);
							 |