$availableLanguage) { // Check if available language has a currency constant if(array_key_exists("Currency", $availableLanguage["Constants"]) === TRUE) { // Get available language's currency $currency = $availableLanguage["Constants"]["Currency"]; // Check if currency isn't already in the list of language currencies if(in_array($currency, $languageCurrencies, TRUE) === FALSE) // Append currency to list of language currencies array_push($languageCurrencies, $currency); } } // Sort language currencies by currency name usort($languageCurrencies, function($firstValue, $secondValue) { return strcoll($firstValue, $secondValue); }); } // Return language currencies return $languageCurrencies; } // Get translation contributors function getTransactionContributors() { // Declare translation contributors static $translationContributors; // Check if translation contributors doesn't exist if(isset($translationContributors) === FALSE) { // Set translation contributors $translationContributors = []; // Go through all available languages foreach(getAvailableLanguages() as $languageIdentifier => $availableLanguage) { // Check if available language has contributors if(array_key_exists("Contributors", $availableLanguage) === TRUE) { // Get available language's contributors $contributors = $availableLanguage["Contributors"]; // Go through all contributors foreach($contributors as $contributor => $link) { // Check if contributor doesn't have a link if(is_int($contributor) === True) { // Check if contributor isn't already in the list of translation contributors if(in_array($link, $translationContributors, TRUE) === FALSE) // Append contributor to list of translation contributors array_push($translationContributors, $link); } // Otherwise else { // Check if contributor isn't already in the list of translation contributors if(in_array($contributor, $translationContributors, TRUE) === FALSE) // Append contributor to list of translation contributors $translationContributors[$link] = $contributor; } } } } // Sort translation contributors by contributor name uasort($translationContributors, function($firstValue, $secondValue) { return strcoll($firstValue, $secondValue); }); } // Return translation contributors return $translationContributors; } // Get translated type value function getTranslatedTypeValue($type, $value) { // Get language $language = getLanguage(); // Check if type is text and value is a standalone placeholder if($type === "Text" && preg_match(PLACEHOLDER_PATTERN, $value) === 1) { // Return value and the language used return [ // Result "Result" => $value, // Language "Language" => $language ]; } // Otherwise else { // Get available languages $availableLanguages = getAvailableLanguages(); // Loop until a result is returned while(TRUE) { // Check if language is available if(array_key_exists($language, $availableLanguages) === TRUE) { // Check if specified type exist for the language and the specified value exists if(array_key_exists($type, $availableLanguages[$language]) === TRUE && array_key_exists($value, $availableLanguages[$language][$type]) === TRUE) // Return value for the language and the language used return [ // Result "Result" => $availableLanguages[$language][$type][$value], // Language "Language" => $language ]; // Otherwise check if language provided a fallback language else if($language !== DEFAULT_LANGUAGE && array_key_exists("Constants", $availableLanguages[$language]) === TRUE && array_key_exists("Fallback", $availableLanguages[$language]["Constants"]) === TRUE) // Set language to the language's fallback language $language = $availableLanguages[$language]["Constants"]["Fallback"]; // Otherwise check if the language is not the default language else if($language !== DEFAULT_LANGUAGE) // Set language to default language $language = DEFAULT_LANGUAGE; // Otherwise else { // Check if type is constants if($type === "Constants") { // Return empty string and the language used return [ // Result "Result" => "", // Language "Language" => $language ]; } // Otherwise assume type is text else { // Return value and the language used return [ // Result "Result" => $value, // Language "Language" => $language ]; } } } // Otherwise check if the language is not the default language else if($language !== DEFAULT_LANGUAGE) // Set language to default language $language = DEFAULT_LANGUAGE; // Otherwise else { // Check if type is constants if($type === "Constants") { // Return empty string and the language used return [ // Result "Result" => "", // Language "Language" => $language ]; } // Otherwise assume type is text else { // Return value and the language used return [ // Result "Result" => $value, // Language "Language" => $language ]; } } } } } // Get constant function getConstant($constant) { // Return translation for the specified constant return getTranslatedTypeValue("Constants", $constant)["Result"]; } // Get translation function getTranslation($text, $arguments = []) { // Get translated text $translatedText = getTranslatedTypeValue("Text", $text); // Go through all arguments foreach($arguments as &$argument) { // Check if argument is a function if(is_callable($argument) === TRUE) // Resolve the argument's value using the translated text's language $argument = $argument($translatedText["Language"], $text); } // Get formatted translation for the specified text $formattedTranslation = vsprintf($translatedText["Result"], $arguments); // Check if formatting translation failed if($formattedTranslation === FALSE) // Return empty string return ""; // Otherwise else // Return formatted translation return $formattedTranslation; } // Get default translation function getDefaultTranslation($text) { // Return text return $text; } // Get number translation function getNumberTranslation($number) { // Check if number isn't valid if(is_string($number) === TRUE || is_numeric($number) === FALSE) { // Return function return function($language, $value) { // Return empty string return ""; }; } // Otherwise else { // Return function return function($language, $value) use ($number) { // Get available languages $availableLanguages = getAvailableLanguages(); // Loop until a result is returned while(TRUE) { // Check if language is available or value is a standalone placeholder if(array_key_exists($language, $availableLanguages) === TRUE || preg_match(PLACEHOLDER_PATTERN, $value) === 1) { // Set number formatter $numberFormatter = new NumberFormatter($language, NumberFormatter::DECIMAL); // Check if number formatter is valid and it can format using the provided language if($numberFormatter !== FALSE && preg_replace('/_/u', "-", $numberFormatter->getLocale(Locale::VALID_LOCALE)) === $language) { // Configure number formatter $numberFormatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, NUMBER_FORMAT_MINIMUM_FRACTION_DIGITS); $numberFormatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, NUMBER_FORMAT_MAXIMUM_FRACTION_DIGITS); $numberFormatter->setAttribute(NumberFormatter::GROUPING_USED, NUMBER_FORMAT_USE_GROUPING); $numberFormatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_DOWN); // Return number formatted as the language return $numberFormatter->format($number); } // Otherwise check if language provided a fallback language else if($language !== DEFAULT_LANGUAGE && array_key_exists("Constants", $availableLanguages[$language]) === TRUE && array_key_exists("Fallback", $availableLanguages[$language]["Constants"]) === TRUE) // Set language to the language's fallback language $language = $availableLanguages[$language]["Constants"]["Fallback"]; // Otherwise check if the language is not the default language else if($language !== DEFAULT_LANGUAGE) // Set language to default language $language = DEFAULT_LANGUAGE; // Otherwise else // Return number return $number; } // Otherwise check if the language is not the default language else if($language !== DEFAULT_LANGUAGE) // Set language to default language $language = DEFAULT_LANGUAGE; // Otherwise else // Return number return $number; } }; } } // Escape text function escapeText($text) { // Return text with all escape characters escaped return preg_replace('/' . ESCAPE_CHARACTER . '/u', ESCAPE_CHARACTER . ESCAPE_CHARACTER, $text); } // Escape Data function escapeData($array) { // Return array in JSON encoding with ampersands and single quotes encoded as HTML return preg_replace('/\'/u', SINGLE_QUOTE_HTML_ENTITY, preg_replace('/&/u', AMPERSAND_HTML_ENTITY, json_encode($array))); } // Main function // Set locale setlocale(LC_ALL, DEFAULT_LOCALE); ?>