diff --git a/src/Event/ConfigureLocales.php b/src/Event/ConfigureLocales.php index 8ecf98518..64044e7c4 100644 --- a/src/Event/ConfigureLocales.php +++ b/src/Event/ConfigureLocales.php @@ -10,7 +10,9 @@ namespace Flarum\Event; +use DirectoryIterator; use Flarum\Locale\LocaleManager; +use RuntimeException; class ConfigureLocales { @@ -26,4 +28,45 @@ class ConfigureLocales { $this->locales = $locales; } + + /** + * Load language pack resources from the given directory. + * + * @param $directory + */ + public function loadLanguagePackFrom($directory) + { + $name = $title = basename($directory); + + if (file_exists($manifest = __DIR__.'/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."); + } + + $this->locales->addLocale($locale, $title); + + if (! is_dir($localeDir = __DIR__.'/locale')) { + throw new RuntimeException("Language pack $name must have a \"locale\" subdirectory."); + } + + if (file_exists($file = $localeDir.'/config.js')) { + $this->locales->addJsFile($locale, $file); + } + + foreach (new DirectoryIterator($localeDir) as $file) { + if ($file->isFile() && in_array($file->getExtension(), ['yml', 'yaml'])) { + $this->locales->addTranslations($locale, $file->getPathname()); + } + } + } }