<?php
declare(strict_types=1);
namespace MPBC;
use MPBC\Data\Notification;
use MPBC\Helper\Umpirsky_Helper;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Bundles {
/**
* @var array <code>[ Language/locale => [ Country code => Country name ] ]</code>
*/
private static array $countries = array();
/**
* @var array <code>[
* Language/locale => [
* Currency code => [
* label => string,
* symbol => string,
* ]
* ]
* ]</code>
*/
private static array $currencies = array();
/**
* @var array <code>[ Currency code => Currency symbol ]</code>
*/
private static array $used_currency_symbols = array(); // "Cached" values
/**
* @var array <code>[ WordPress locale => Flatpickr locale ]</code>
*/
private static array $used_flatpickr_locales = array(); // "Cached" values
/**
* @param string|null $language Current language by default.
* @return array <code>[ Country code => Country name ]</code>
*/
public static function get_countries( ?string $language = null ): array {
if ( empty( $language ) ) {
$language = Settings::get_current_language();
}
if ( ! isset( static::$countries[ $language ] ) ) {
static::$countries[ $language ] = Umpirsky_Helper::get_country_list( $language );
}
return static::$countries[ $language ];
}
public static function get_country_label( string $country_code ): string {
$countries = static::get_countries();
return $countries[ $country_code ] ?? $country_code;
}
/**
* @param string|null $language Current language by default.
* @return array <code>[ Currency code => [ label, symbol ] ]</code>
*/
public static function get_currencies( ?string $language = null ): array {
if ( empty( $language ) ) {
$language = Settings::get_current_language();
}
if ( ! isset( static::$currencies[ $language ] ) ) {
$currency_list = Umpirsky_Helper::get_currency_list( $language );
$currency_symbols = static::get_currency_symbols();
$currencies = array(
// Prioritize EUR, USD and GBP currencies:
// [EUR, USD, GBP, ... all other currencies]
'EUR' => array(
'label' => 'Euro',
'symbol' => $currency_symbols['EUR'],
),
'USD' => array(
'label' => 'US Dollar',
'symbol' => $currency_symbols['USD'],
),
'GBP' => array(
'label' => 'British Pound',
'symbol' => $currency_symbols['GBP'],
),
);
foreach ( $currency_list as $code => $label ) {
if ( array_key_exists( $code, $currency_symbols ) ) {
$currencies[ $code ] = array(
'label' => $label,
'symbol' => $currency_symbols[ $code ],
);
}
}
/**
* @param array $currencies <code>[ Currency code => [ label, symbol ] ]</code>
* @param string $language Current language.
*/
static::$currencies[ $language ] = apply_filters( 'mpbc_currencies', $currencies, $language );
}
return static::$currencies[ $language ];
}
public static function get_currency_symbol( string $currency ): string {
$symbol = static::$used_currency_symbols[ $currency ] ?? '';
if ( ! $symbol ) {
$symbol = static::get_currencies()[ $currency ]['symbol'] ?? '';
static::$used_currency_symbols[ $currency ] = $symbol;
}
return $symbol;
}
public static function get_flatpickr_locale( string $wp_locale ): string {
if ( isset( static::$used_flatpickr_locales[ $wp_locale ] ) ) {
return static::$used_flatpickr_locales[ $wp_locale ];
}
$flatpickr_locale = 'default';
$available_locales = static::get_flatpickr_locales();
if ( in_array( $wp_locale, $available_locales ) ) {
$flatpickr_locale = $wp_locale;
} else {
// Try to guess the replacement
$primary_language_tag = substr( $wp_locale, 0, 2 ); // "es_ES" -> "es"
$wp2fp_locales = array(
// Excluding pairs representing the same primary tag/language:
// "<primary tag>_<subtags>" => "<primary tag>"
'bel' => 'be',
'ca' => 'cat',
'de_AT' => 'at',
'el' => 'gr',
'kk' => 'kz',
'nb_NO' => 'no',
'vi' => 'vn',
'zh_TW' => 'zh_tw',
);
if ( array_key_exists( $wp_locale, $wp2fp_locales ) ) {
$flatpickr_locale = $wp2fp_locales[ $wp_locale ];
} elseif ( in_array( $primary_language_tag, $available_locales ) ) {
$flatpickr_locale = $primary_language_tag;
}
}
static::$used_flatpickr_locales[ $wp_locale ] = $flatpickr_locale;
return $flatpickr_locale;
}
/**
* @return array Array of: <code>[
* label => string,
* recipients => ?string[],
* subject => ?string,
* header => ?string,
* message => ?string,
* template => ?string,
* ]</code>
*/
public static function get_email_templates(): array {
return array(
'none' => array(
'label' => __( '— Select —', 'motopress-booking-calendar' ),
),
'admin_new_booking' => array(
'label' => __( 'New booking (admin)', 'motopress-booking-calendar' ),
'recipients' => array( Notification::RECIPIENT_ADMIN ),
'subject' => __( '{site_title} - New Booking #{booking_id}', 'motopress-booking-calendar' ),
'header' => __( 'New Booking #{booking_id}', 'motopress-booking-calendar' ),
'template' => 'email/template/admin-new-booking-template.php',
),
'customer_new_booking' => array(
'label' => __( 'New booking (customer)', 'motopress-booking-calendar' ),
'recipients' => array( Notification::RECIPIENT_CUSTOMER ),
'subject' => __( '{site_title} - Booking #{booking_id}', 'motopress-booking-calendar' ),
'header' => __( 'Booking #{booking_id}', 'motopress-booking-calendar' ),
'template' => 'email/template/customer-new-booking-template.php',
),
'admin_cancelled_booking' => array(
'label' => __( 'Cancelled booking (admin)', 'motopress-booking-calendar' ),
'trigger_event' => Notification::TRIGGER_EVENT_BOOKING_CANCELLED,
'recipients' => array( Notification::RECIPIENT_ADMIN ),
'subject' => __( '{site_title} - Booking #{booking_id}', 'motopress-booking-calendar' ),
'header' => __( 'Booking #{booking_id} is cancelled', 'motopress-booking-calendar' ),
'template' => 'email/template/admin-cancelled-booking-template.php',
),
'customer_cancelled_booking' => array(
'label' => __( 'Cancelled booking (customer)', 'motopress-booking-calendar' ),
'trigger_event' => Notification::TRIGGER_EVENT_BOOKING_CANCELLED,
'recipients' => array( Notification::RECIPIENT_CUSTOMER ),
'subject' => __( '{site_title} - Booking #{booking_id}', 'motopress-booking-calendar' ),
'header' => __( 'Booking #{booking_id} is cancelled', 'motopress-booking-calendar' ),
'template' => 'email/template/customer-cancelled-booking-template.php',
),
);
}
/**
* @return string[]
*/
public static function get_currency_positions(): array {
return array(
'before' => __( 'Before', 'motopress-booking-calendar' ),
'after' => __( 'After', 'motopress-booking-calendar' ),
'before-space' => __( 'Before with space', 'motopress-booking-calendar' ),
'after-space' => __( 'After with space', 'motopress-booking-calendar' ),
);
}
private static function get_currency_symbols(): array {
return array(
'AED' => 'د.إ',
'AFN' => '؋',
'ALL' => 'L',
'AMD' => 'AMD',
'ANG' => 'ƒ',
'AOA' => 'Kz',
'ARS' => '$',
'AUD' => '$',
'AWG' => 'Afl.',
'AZN' => 'AZN',
'BAM' => 'KM',
'BBD' => '$',
'BDT' => '৳ ',
'BGN' => 'лв.',
'BHD' => '.د.ب',
'BIF' => 'Fr',
'BMD' => '$',
'BND' => '$',
'BOB' => 'Bs.',
'BRL' => 'R$',
'BSD' => '$',
'BTC' => '฿',
'BTN' => 'Nu.',
'BWP' => 'P',
'BYN' => 'Br',
'BYR' => 'Br',
'BZD' => '$',
'CAD' => '$',
'CDF' => 'Fr',
'CHF' => 'CHF',
'CLP' => '$',
'CNY' => '¥',
'COP' => '$',
'CRC' => '₡',
'CUC' => '$',
'CUP' => '$',
'CVE' => '$',
'CZK' => 'Kč',
'DJF' => 'Fr',
'DKK' => 'DKK',
'DOP' => 'RD$',
'DZD' => 'د.ج',
'EGP' => 'EGP',
'ERN' => 'Nfk',
'ETB' => 'Br',
'EUR' => '€',
'FJD' => '$',
'FKP' => '£',
'GBP' => '£',
'GEL' => '₾',
'GGP' => '£',
'GHS' => '₵',
'GIP' => '£',
'GMD' => 'D',
'GNF' => 'Fr',
'GTQ' => 'Q',
'GYD' => '$',
'HKD' => '$',
'HNL' => 'L',
'HRK' => 'Kn',
'HTG' => 'G',
'HUF' => 'Ft',
'IDR' => 'Rp',
'ILS' => '₪',
'IMP' => '£',
'INR' => '₹',
'IQD' => 'ع.د',
'IRR' => '﷼',
'IRT' => 'تومان',
'ISK' => 'kr.',
'JEP' => '£',
'JMD' => '$',
'JOD' => 'د.ا',
'JPY' => '¥',
'KES' => 'KSh',
'KGS' => 'сом',
'KHR' => '៛',
'KMF' => 'Fr',
'KPW' => '₩',
'KRW' => '₩',
'KWD' => 'د.ك',
'KYD' => '$',
'KZT' => 'KZT',
'LAK' => '₭',
'LBP' => 'ل.ل',
'LKR' => 'රු',
'LRD' => '$',
'LSL' => 'L',
'LYD' => 'ل.د',
'MAD' => 'د.م.',
'MDL' => 'MDL',
'MGA' => 'Ar',
'MKD' => 'ден',
'MMK' => 'Ks',
'MNT' => '₮',
'MOP' => 'P',
'MRO' => 'UM',
'MUR' => '₨',
'MVR' => '.ރ',
'MWK' => 'MK',
'MXN' => '$',
'MYR' => 'RM',
'MZN' => 'MT',
'NAD' => '$',
'NGN' => '₦',
'NIO' => 'C$',
'NOK' => 'kr',
'NPR' => '₨',
'NZD' => '$',
'OMR' => 'ر.ع.',
'PAB' => 'B/.',
'PEN' => 'S/.',
'PGK' => 'K',
'PHP' => '₱',
'PKR' => '₨',
'PLN' => 'zł',
'PRB' => 'р.',
'PYG' => '₲',
'QAR' => 'ر.ق',
'RON' => 'lei',
'RSD' => 'дин.',
'RUB' => '₽',
'RWF' => 'Fr',
'SAR' => 'ر.س',
'SBD' => '$',
'SCR' => '₨',
'SDG' => 'ج.س.',
'SEK' => 'kr',
'SGD' => '$',
'SHP' => '£',
'SLL' => 'Le',
'SOS' => 'Sh',
'SRD' => '$',
'SSP' => '£',
'STD' => 'Db',
'SYP' => 'ل.س',
'SZL' => 'L',
'THB' => '฿',
'TJS' => 'ЅМ',
'TMT' => 'm',
'TND' => 'د.ت',
'TOP' => 'T$',
'TRY' => '₺',
'TTD' => '$',
'TWD' => 'NT$',
'TZS' => 'Sh',
'UAH' => '₴',
'UGX' => 'UGX',
'USD' => '$',
'UYU' => '$',
'UZS' => 'UZS',
'VEF' => 'Bs F',
'VES' => 'Bs.S',
'VND' => '₫',
'VUV' => 'Vt',
'WST' => 'T',
'XAF' => 'CFA',
'XCD' => '$',
'XOF' => 'CFA',
'XPF' => 'Fr',
'YER' => '﷼',
'ZAR' => 'R',
'ZMW' => 'ZK',
);
}
private static function get_flatpickr_locales(): array {
return array(
'ar',
'ar-dz',
'at',
'az',
'be',
'bg',
'bn',
'bs',
'cat',
'ckb',
'cs',
'cy',
'da',
'de',
'eo',
'es',
'et',
'fa',
'fi',
'fo',
'fr',
'ga',
'gr',
'he',
'hi',
'hr',
'hu',
'hy',
'id',
'is',
'it',
'ja',
'ka',
'km',
'ko',
'kz',
'lt',
'lv',
'mk',
'mn',
'ms',
'my',
'nl',
'nn',
'no',
'pa',
'pl',
'pt',
'ro',
'ru',
'si',
'sk',
'sl',
'sq',
'sr',
'sr-cyr',
'sv',
'th',
'tr',
'uk',
'uz',
'uz_latn',
'vn',
'zh',
'zh_tw',
'zh-tw',
);
}
}