$languageDefinitions */ function generate_known_translation_keys(array $languageDefinitions) : void{ ob_start(); echo SHARED_HEADER; echo <<<'HEADER' /** * This class contains constants for all the translations known to PocketMine-MP as per the used version of pmmp/Language. * This class is generated automatically, do NOT modify it by hand. * * @internal */ final class KnownTranslationKeys{ HEADER; ksort($languageDefinitions, SORT_STRING); foreach(Utils::stringifyKeys($languageDefinitions) as $k => $_){ echo "\tpublic const "; echo constantify($k); echo " = \"" . $k . "\";\n"; } echo "}\n"; file_put_contents(dirname(__DIR__) . '/src/lang/KnownTranslationKeys.php', ob_get_clean()); echo "Done generating KnownTranslationKeys.\n"; } /** * @param string[] $languageDefinitions * @phpstan-param array $languageDefinitions */ function generate_known_translation_factory(array $languageDefinitions) : void{ ob_start(); echo SHARED_HEADER; echo <<<'HEADER' /** * This class contains factory methods for all the translations known to PocketMine-MP as per the used version of * pmmp/Language. * This class is generated automatically, do NOT modify it by hand. * * @internal */ final class KnownTranslationFactory{ HEADER; ksort($languageDefinitions, SORT_STRING); $parameterRegex = '/{%(.+?)}/'; $translationContainerClass = (new \ReflectionClass(Translatable::class))->getShortName(); foreach(Utils::stringifyKeys($languageDefinitions) as $key => $value){ $parameters = []; $allParametersPositional = true; if(preg_match_all($parameterRegex, $value, $matches) > 0){ foreach($matches[1] as $parameterName){ if(is_numeric($parameterName)){ $parameters[$parameterName] = "param$parameterName"; }else{ $parameters[$parameterName] = $parameterName; $allParametersPositional = false; } } } if($allParametersPositional){ ksort($parameters, SORT_NUMERIC); } echo "\tpublic static function " . functionify($key) . "(" . implode(", ", array_map(fn(string $paramName) => "$translationContainerClass|string \$$paramName", $parameters)) . ") : $translationContainerClass{\n"; echo "\t\treturn new $translationContainerClass(KnownTranslationKeys::" . constantify($key) . ", ["; foreach($parameters as $parameterKey => $parameterName){ echo "\n\t\t\t"; if(!is_numeric($parameterKey)){ echo "\"$parameterKey\""; }else{ echo $parameterKey; } echo " => \$$parameterName,"; } if(count($parameters) !== 0){ echo "\n\t\t"; } echo "]);\n\t}\n\n"; } echo "}\n"; file_put_contents(dirname(__DIR__) . '/src/lang/KnownTranslationFactory.php', ob_get_clean()); echo "Done generating KnownTranslationFactory.\n"; } $lang = parse_ini_file(Path::join(\pocketmine\LOCALE_DATA_PATH, "eng.ini"), false, INI_SCANNER_RAW); if($lang === false){ fwrite(STDERR, "Missing language files!\n"); exit(1); } generate_known_translation_keys($lang); generate_known_translation_factory($lang);