diff --git a/database/migrations/2019_10_24_115350_create_namespaces_table.php b/database/migrations/2019_10_24_115350_create_namespaces_table.php new file mode 100644 index 00000000..d2172ff0 --- /dev/null +++ b/database/migrations/2019_10_24_115350_create_namespaces_table.php @@ -0,0 +1,33 @@ +bigIncrements('id'); + $table->string('namespace'); + $table->string('path'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('ltm_namespaces'); + } +} diff --git a/src/Manager.php b/src/Manager.php index 7e478f5e..3ff4a0ef 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -9,6 +9,7 @@ use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Contracts\Foundation\Application; use Barryvdh\TranslationManager\Models\Translation; +use Barryvdh\TranslationManager\Models\TranslationNamespace; use Barryvdh\TranslationManager\Events\TranslationsExportedEvent; class Manager @@ -51,40 +52,60 @@ protected function getIgnoredLocales() return ($result && is_array($result)) ? $result : []; } - public function importTranslations($replace = false, $base = null, $import_group = false) + public function importTranslations($replace = false) { $counter = 0; - //allows for vendor lang files to be properly recorded through recursion. - $vendor = true; - if ($base == null) { + + // Main app and vendor translations + $counter += $this->importArrayTranslations($replace); + + // other registered namespaces + $namespaces = \Lang::getLoader()->namespaces(); + foreach ($namespaces as $namespace => $dir) { + $counter += $this->importArrayTranslations($replace, $dir, $namespace); + } + + // Json translations + $counter += $this->importJsonTranslations($replace); + + return $counter; + } + + /** + * Import array translations + * + * @return int + */ + public function importArrayTranslations($replace = false, $base = null, $namespace = null) + { + $counter = 0; + + if (!$base) { $base = $this->app['path.lang']; $vendor = false; + } else { + $vendor = $namespace === null; } foreach ($this->files->directories($base) as $langPath) { $locale = basename($langPath); - //import langfiles for each vendor + // import langfiles for each vendor if ($locale == 'vendor') { foreach ($this->files->directories($langPath) as $vendor) { - $counter += $this->importTranslations($replace, $vendor); + $counter += $this->importArrayTranslations($replace, $vendor); } - continue; } - $vendorName = $this->files->name($this->files->dirname($langPath)); + foreach ($this->files->allfiles($langPath) as $file) { $info = pathinfo($file); $group = $info['filename']; - if ($import_group) { - if ($import_group !== $group) { - continue; - } - } if (in_array($group, $this->config['exclude_groups'])) { continue; } + $subLangPath = str_replace($langPath.DIRECTORY_SEPARATOR, '', $info['dirname']); $subLangPath = str_replace(DIRECTORY_SEPARATOR, '/', $subLangPath); $langPath = str_replace(DIRECTORY_SEPARATOR, '/', $langPath); @@ -93,11 +114,15 @@ public function importTranslations($replace = false, $base = null, $import_group $group = $subLangPath.'/'.$group; } - if (! $vendor) { - $translations = \Lang::getLoader()->load($locale, $group); + if (!$vendor) { + $translations = \Lang::getLoader()->load($locale, $group, $namespace); + if ($namespace) { + $group = $namespace .'::'. $group; + } } else { $translations = include $file; - $group = 'vendor/'.$vendorName; + $vendorName = $this->files->name($this->files->dirname($langPath)); + $group = 'vendor/'. $vendorName .'/'. $group; } if ($translations && is_array($translations)) { @@ -105,10 +130,29 @@ public function importTranslations($replace = false, $base = null, $import_group $importedTranslation = $this->importTranslation($key, $value, $locale, $group, $replace); $counter += $importedTranslation ? 1 : 0; } + + if ($namespace) { + TranslationNamespace::updateOrCreate( + ['namespace' => $namespace], + ['path' => $base] + ); + } } } } + return $counter; + } + + /** + * Import Json translations + * + * @return int + */ + public function importJsonTranslations($replace = false) + { + $counter = 0; + foreach ($this->files->files($this->app['path.lang']) as $jsonTranslationFile) { if (strpos($jsonTranslationFile, '.json') === false) { continue; @@ -268,17 +312,24 @@ public function exportTranslations($group = null, $json = false) $tree = $this->makeTree(Translation::ofTranslatedGroup($group) ->orderByGroupKeys(Arr::get($this->config, 'sort_keys', false)) ->get()); + $namespaces = TranslationNamespace::all()->pluck('path', 'namespace'); + $group_name = $group; foreach ($tree as $locale => $groups) { - if (isset($groups[$group])) { - $translations = $groups[$group]; + if (isset($groups[$group_name])) { + $translations = $groups[$group_name]; $path = $this->app['path.lang']; - $locale_path = $locale.DIRECTORY_SEPARATOR.$group; + if (Str::contains($group, '::')) { + list($namespace, $group) = explode('::', $group, 2); + $path = $namespaces[$namespace] ?? $this->app['path.lang']; + } + if ($vendor) { - $path = $basePath.'/'.$group.'/'.$locale; - $locale_path = Str::after($group, '/'); + list($package, $group) = explode('/', Str::after($group, 'vendor/'), 2); + $path = $basePath . DIRECTORY_SEPARATOR .'vendor'. DIRECTORY_SEPARATOR . $package; } + $locale_path = $locale.DIRECTORY_SEPARATOR.$group; $subfolders = explode(DIRECTORY_SEPARATOR, $locale_path); array_pop($subfolders); @@ -371,6 +422,7 @@ public function cleanTranslations() public function truncateTranslations() { Translation::truncate(); + TranslationNamespace::truncate(); } public function getLocales() diff --git a/src/Models/TranslationNamespace.php b/src/Models/TranslationNamespace.php new file mode 100644 index 00000000..e2137cb4 --- /dev/null +++ b/src/Models/TranslationNamespace.php @@ -0,0 +1,11 @@ +