/** * Creates an address format definition from Google's raw definition. */ function create_address_format_definition($countryCode, $rawDefinition) { // Avoid notices. $rawDefinition += ['lang' => null, 'fmt' => null, 'require' => null, 'upper' => null, 'state_name_type' => null, 'locality_name_type' => null, 'sublocality_name_type' => null, 'zip_name_type' => null]; // ZZ holds the defaults for all address formats, and these are missing. if ($countryCode == 'ZZ') { $rawDefinition['state_name_type'] = AdministrativeAreaType::getDefault(); $rawDefinition['sublocality_name_type'] = DependentLocalityType::getDefault(); $rawDefinition['zip_name_type'] = PostalCodeType::getDefault(); } $addressFormat = ['locale' => process_locale($rawDefinition['lang']), 'format' => null, 'local_format' => null, 'required_fields' => convert_fields($rawDefinition['require'], 'required'), 'uppercase_fields' => convert_fields($rawDefinition['upper'], 'uppercase')]; if (isset($rawDefinition['lfmt']) && $rawDefinition['lfmt'] != $rawDefinition['fmt']) { $addressFormat['format'] = convert_format($countryCode, $rawDefinition['lfmt']); $addressFormat['local_format'] = convert_format($countryCode, $rawDefinition['fmt']); } else { $addressFormat['format'] = convert_format($countryCode, $rawDefinition['fmt']); // We don't need the locale if there's no local format. unset($addressFormat['locale']); } $addressFormat['administrative_area_type'] = $rawDefinition['state_name_type']; $addressFormat['locality_type'] = $rawDefinition['locality_name_type']; $addressFormat['dependent_locality_type'] = $rawDefinition['sublocality_name_type']; $addressFormat['postal_code_type'] = $rawDefinition['zip_name_type']; if (isset($rawDefinition['zip'])) { $addressFormat['postal_code_pattern'] = $rawDefinition['zip']; } if (isset($rawDefinition['postprefix'])) { // Workaround for https://github.com/googlei18n/libaddressinput/issues/72. if ($rawDefinition['postprefix'] == 'PR') { $rawDefinition['postprefix'] = 'PR '; } elseif ($rawDefinition['postprefix'] == 'SI-') { $rawDefinition['postprefix'] = 'SI- '; } $addressFormat['postal_code_prefix'] = $rawDefinition['postprefix']; // Remove the prefix from the format strings. // Workaround for https://github.com/googlei18n/libaddressinput/issues/71. $addressFormat['format'] = str_replace($addressFormat['postal_code_prefix'], '', $addressFormat['format']); $addressFormat['local_format'] = str_replace($addressFormat['postal_code_prefix'], '', $addressFormat['local_format']); } // Add the subdivision_depth to the end of the ZZ definition. if ($countryCode == 'ZZ') { $addressFormat['subdivision_depth'] = 0; } // Apply any customizations. $customizations = get_address_format_customizations($countryCode); foreach ($customizations as $key => $values) { $addressFormat[$key] = $values; } // Denote the end of the format string for file_put_php(). if (!empty($addressFormat['format'])) { $addressFormat['format'] .= ';;;'; } if (!empty($addressFormat['local_format'])) { $addressFormat['local_format'] .= ';;;'; } // Remove NULL keys. $addressFormat = array_filter($addressFormat, function ($value) { return !is_null($value); }); // Remove empty local formats. if (empty($addressFormat['local_format'])) { unset($addressFormat['local_format']); } return $addressFormat; }
/** * Creates an address format definition from Google's raw definition. */ function create_address_format_definition($rawDefinition) { $addressFormat = ['locale' => determine_locale($rawDefinition), 'format' => null, 'required_fields' => convert_fields($rawDefinition['require'], 'required'), 'uppercase_fields' => convert_fields($rawDefinition['upper'], 'uppercase')]; // Make sure the recipient is always required by default. if (!in_array(AddressField::RECIPIENT, $addressFormat['required_fields'])) { $addressFormat['required_fields'] = array_merge([AddressField::RECIPIENT], $addressFormat['required_fields']); } $translations = []; if (isset($rawDefinition['lfmt']) && $rawDefinition['lfmt'] != $rawDefinition['fmt']) { // Handle the China/Korea/Japan dual formats via translations. $language = $rawDefinition['lang']; $translations[$language]['format'] = convert_format($rawDefinition['fmt']); $addressFormat['format'] = convert_format($rawDefinition['lfmt']); } else { $addressFormat['format'] = convert_format($rawDefinition['fmt']); } if (strpos($addressFormat['format'], '%' . AddressField::ADMINISTRATIVE_AREA) !== false) { $addressFormat['administrative_area_type'] = $rawDefinition['state_name_type']; } if (strpos($addressFormat['format'], '%' . AddressField::LOCALITY) !== false) { $addressFormat['locality_type'] = $rawDefinition['locality_name_type']; } if (strpos($addressFormat['format'], '%' . AddressField::DEPENDENT_LOCALITY) !== false) { $addressFormat['dependent_locality_type'] = $rawDefinition['sublocality_name_type']; } if (strpos($addressFormat['format'], '%' . AddressField::POSTAL_CODE) !== false) { $addressFormat['postal_code_type'] = $rawDefinition['zip_name_type']; if (isset($rawDefinition['zip'])) { $addressFormat['postal_code_pattern'] = $rawDefinition['zip']; } if (isset($rawDefinition['postprefix'])) { // Workaround for https://github.com/googlei18n/libaddressinput/issues/72. if ($rawDefinition['postprefix'] == 'PR') { $rawDefinition['postprefix'] = 'PR '; } elseif ($rawDefinition['postprefix'] == 'SI-') { $rawDefinition['postprefix'] = 'SI- '; } $addressFormat['postal_code_prefix'] = $rawDefinition['postprefix']; // Remove the prefix from the format strings. // Workaround for https://github.com/googlei18n/libaddressinput/issues/71. $addressFormat['format'] = str_replace($addressFormat['postal_code_prefix'], '', $addressFormat['format']); foreach ($translations as $language => $translation) { $translations[$language]['format'] = str_replace($addressFormat['postal_code_prefix'], '', $translation['format']); } } } // Add translations as the last key. if ($translations) { $addressFormat['translations'] = $translations; } return $addressFormat; }