Version 1
[yaffs-website] / web / core / scripts / update-countries.sh
diff --git a/web/core/scripts/update-countries.sh b/web/core/scripts/update-countries.sh
new file mode 100755 (executable)
index 0000000..6a8921d
--- /dev/null
@@ -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);