From d26631d8e0cc5b9d83408a4ef1e44c460548b80e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 30 Jul 2018 17:00:52 +0100 Subject: [PATCH] Clean up BaseLang error handling, throw exceptions instead --- src/pocketmine/Server.php | 15 ++++++- src/pocketmine/lang/BaseLang.php | 44 +++++++++++-------- .../lang/LanguageNotFoundException.php | 28 ++++++++++++ src/pocketmine/wizard/SetupWizard.php | 6 ++- 4 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 src/pocketmine/lang/LanguageNotFoundException.php diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 5d562145c..c6db4953e 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -46,6 +46,7 @@ use pocketmine\item\enchantment\Enchantment; use pocketmine\item\Item; use pocketmine\item\ItemFactory; use pocketmine\lang\BaseLang; +use pocketmine\lang\LanguageNotFoundException; use pocketmine\lang\TextContainer; use pocketmine\level\biome\Biome; use pocketmine\level\format\io\LevelProvider; @@ -1442,7 +1443,19 @@ class Server{ define('pocketmine\DEBUG', (int) $this->getProperty("debug.level", 1)); $this->forceLanguage = (bool) $this->getProperty("settings.force-language", false); - $this->baseLang = new BaseLang($this->getProperty("settings.language", BaseLang::FALLBACK_LANGUAGE)); + $selectedLang = $this->getProperty("settings.language", BaseLang::FALLBACK_LANGUAGE); + try{ + $this->baseLang = new BaseLang($selectedLang); + }catch(LanguageNotFoundException $e){ + $this->logger->error($e->getMessage()); + try{ + $this->baseLang = new BaseLang(BaseLang::FALLBACK_LANGUAGE); + }catch(LanguageNotFoundException $e){ + $this->logger->emergency("Fallback language \"" . BaseLang::FALLBACK_LANGUAGE . "\" not found"); + return; + } + } + $this->logger->info($this->getLanguage()->translateString("language.selected", [$this->getLanguage()->getName(), $this->getLanguage()->getLang()])); if(\pocketmine\IS_DEVELOPMENT_BUILD){ diff --git a/src/pocketmine/lang/BaseLang.php b/src/pocketmine/lang/BaseLang.php index e573a0f73..628e38951 100644 --- a/src/pocketmine/lang/BaseLang.php +++ b/src/pocketmine/lang/BaseLang.php @@ -23,12 +23,16 @@ declare(strict_types=1); namespace pocketmine\lang; -use pocketmine\utils\MainLogger; - class BaseLang{ public const FALLBACK_LANGUAGE = "eng"; + /** + * @param string $path + * + * @return array + * @throws LanguageNotFoundException + */ public static function getLanguageList(string $path = "") : array{ if($path === ""){ $path = \pocketmine\PATH . "src/pocketmine/lang/locale/"; @@ -45,10 +49,10 @@ class BaseLang{ $result = []; foreach($files as $file){ - $strings = []; - self::loadLang($path . $file, $strings); + $code = explode(".", $file)[0]; + $strings = self::loadLang($path, $code); if(isset($strings["language.name"])){ - $result[substr($file, 0, -4)] = $strings["language.name"]; + $result[$code] = $strings["language.name"]; } } @@ -56,7 +60,7 @@ class BaseLang{ } } - return []; + throw new LanguageNotFoundException("Language directory $path does not exist or is not a directory"); } /** @var string */ @@ -67,20 +71,22 @@ class BaseLang{ /** @var string[] */ protected $fallbackLang = []; + /** + * @param string $lang + * @param string|null $path + * @param string $fallback + * + * @throws LanguageNotFoundException + */ public function __construct(string $lang, string $path = null, string $fallback = self::FALLBACK_LANGUAGE){ - $this->langName = strtolower($lang); if($path === null){ $path = \pocketmine\PATH . "src/pocketmine/lang/locale/"; } - if(!self::loadLang($file = $path . $this->langName . ".ini", $this->lang)){ - MainLogger::getLogger()->error("Missing required language file $file"); - } - if(!self::loadLang($file = $path . $fallback . ".ini", $this->fallbackLang)){ - MainLogger::getLogger()->error("Missing required language file $file"); - } + $this->lang = self::loadLang($path, $this->langName); + $this->fallbackLang = self::loadLang($path, $fallback); } public function getName() : string{ @@ -91,13 +97,13 @@ class BaseLang{ return $this->langName; } - protected static function loadLang(string $path, array &$d){ - if(file_exists($path)){ - $d = array_map('stripcslashes', parse_ini_file($path, false, INI_SCANNER_RAW)); - return true; - }else{ - return false; + protected static function loadLang(string $path, string $languageCode) : array{ + $file = $path . $languageCode . ".ini"; + if(file_exists($file)){ + return array_map('stripcslashes', parse_ini_file($file, false, INI_SCANNER_RAW)); } + + throw new LanguageNotFoundException("Language \"$languageCode\" not found"); } /** diff --git a/src/pocketmine/lang/LanguageNotFoundException.php b/src/pocketmine/lang/LanguageNotFoundException.php new file mode 100644 index 000000000..8d8b39b5b --- /dev/null +++ b/src/pocketmine/lang/LanguageNotFoundException.php @@ -0,0 +1,28 @@ +message(\pocketmine\NAME . " set-up wizard"); - $langs = BaseLang::getLanguageList(); - if(empty($langs)){ + try{ + $langs = BaseLang::getLanguageList(); + }catch(LanguageNotFoundException $e){ $this->error("No language files found, please use provided builds or clone the repository recursively."); return false; }