From 5aead007304b88e9716e8d039560723524c8ce1f Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 2 Jan 2018 21:59:49 +0100 Subject: [PATCH] Add Locale extender for language pack extensions --- framework/core/src/Extend/Locale.php | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 framework/core/src/Extend/Locale.php diff --git a/framework/core/src/Extend/Locale.php b/framework/core/src/Extend/Locale.php new file mode 100644 index 000000000..08e126b41 --- /dev/null +++ b/framework/core/src/Extend/Locale.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Extend; + +use DirectoryIterator; +use Flarum\Locale\LocaleManager; +use Illuminate\Contracts\Container\Container; +use RuntimeException; + +class Locale implements Extender +{ + protected $directory; + + public function __construct($directory) + { + $this->directory = $directory; + } + + public function apply(Container $container) + { + $this->loadLanguagePackFrom( + $this->directory, + $container->make(LocaleManager::class) + ); + } + + private function loadLanguagePackFrom($directory, LocaleManager $locales) + { + $name = $title = basename($directory); + + if (file_exists($manifest = $directory.'/composer.json')) { + $json = json_decode(file_get_contents($manifest), true); + + if (empty($json)) { + throw new RuntimeException("Error parsing composer.json in $name: ".json_last_error_msg()); + } + + $locale = array_get($json, 'extra.flarum-locale.code'); + $title = array_get($json, 'extra.flarum-locale.title', $title); + } + + if (! isset($locale)) { + throw new RuntimeException("Language pack $name must define \"extra.flarum-locale.code\" in composer.json."); + } + + $locales->addLocale($locale, $title); + + if (! is_dir($localeDir = $directory.'/locale')) { + throw new RuntimeException("Language pack $name must have a \"locale\" subdirectory."); + } + + if (file_exists($file = $localeDir.'/config.js')) { + $locales->addJsFile($locale, $file); + } + + if (file_exists($file = $localeDir.'/config.css')) { + $locales->addCssFile($locale, $file); + } + + foreach (new DirectoryIterator($localeDir) as $file) { + if ($file->isFile() && in_array($file->getExtension(), ['yml', 'yaml'])) { + $locales->addTranslations($locale, $file->getPathname()); + } + } + } +}