From 23a582ae0fbcea8b10cde74353ab6647a602f5cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Marrafa?= Date: Wed, 23 Oct 2019 16:29:40 +0100 Subject: [PATCH 1/7] importTranslations() now imports all registered namespaces --- src/Manager.php | 68 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index 7e478f5e..74c2eae4 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -51,40 +51,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 +113,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)) { @@ -109,6 +133,18 @@ public function importTranslations($replace = false, $base = null, $import_group } } + 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; From d505d855326c0eb243669e0d89526abeae5cff4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Marrafa?= Date: Thu, 24 Oct 2019 12:22:30 +0100 Subject: [PATCH 2/7] Migration and model for namespaces table --- ...9_10_24_115350_create_namespaces_table.php | 33 +++++++++++++++++++ src/Models/TranslationNamespace.php | 11 +++++++ 2 files changed, 44 insertions(+) create mode 100644 database/migrations/2019_10_24_115350_create_namespaces_table.php create mode 100644 src/Models/TranslationNamespace.php 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..a6fe577b --- /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('namespaces'); + } +} 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 @@ + Date: Thu, 24 Oct 2019 12:22:54 +0100 Subject: [PATCH 3/7] Save namespace info on import --- src/Manager.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Manager.php b/src/Manager.php index 74c2eae4..80f47ff2 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 @@ -129,6 +130,13 @@ public function importArrayTranslations($replace = false, $base = null, $namespa $importedTranslation = $this->importTranslation($key, $value, $locale, $group, $replace); $counter += $importedTranslation ? 1 : 0; } + + if ($namespace) { + TranslationNamespace::updateOrCreate( + ['namespace' => $namespace], + ['path' => $base] + ); + } } } } From 6d63b851ff3e512da3019046965f16ef8a895389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Marrafa?= Date: Thu, 24 Oct 2019 13:51:08 +0100 Subject: [PATCH 4/7] Also delete namespace information on translation clear --- src/Manager.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Manager.php b/src/Manager.php index 80f47ff2..0e2bc5f7 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -415,6 +415,7 @@ public function cleanTranslations() public function truncateTranslations() { Translation::truncate(); + TranslationNamespace::truncate(); } public function getLocales() From a681f8c86269be59aa8e183951cc1091702ce9c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Marrafa?= Date: Thu, 24 Oct 2019 15:59:18 +0100 Subject: [PATCH 5/7] Properly exports translations with namespaces --- src/Manager.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index 0e2bc5f7..3e085db8 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -313,16 +313,23 @@ public function exportTranslations($group = null, $json = false) ->orderByGroupKeys(Arr::get($this->config, 'sort_keys', false)) ->get()); + $namespaces = TranslationNamespace::all()->pluck('path', 'namespace'); + foreach ($tree as $locale => $groups) { if (isset($groups[$group])) { $translations = $groups[$group]; $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); From f604261ae91f11bc7ae570bee1c9fe9951fc0c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Marrafa?= Date: Fri, 25 Oct 2019 12:23:04 +0100 Subject: [PATCH 6/7] Fix for issue where group name is changed during export --- src/Manager.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index 3e085db8..3ff4a0ef 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -312,12 +312,12 @@ 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']; if (Str::contains($group, '::')) { From c71e3809f40cb0052c1145a9789150a840fd9a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Marrafa?= Date: Fri, 25 Oct 2019 12:44:55 +0100 Subject: [PATCH 7/7] Fix namespaces table name in migration drop --- .../migrations/2019_10_24_115350_create_namespaces_table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2019_10_24_115350_create_namespaces_table.php b/database/migrations/2019_10_24_115350_create_namespaces_table.php index a6fe577b..d2172ff0 100644 --- a/database/migrations/2019_10_24_115350_create_namespaces_table.php +++ b/database/migrations/2019_10_24_115350_create_namespaces_table.php @@ -28,6 +28,6 @@ public function up() */ public function down() { - Schema::dropIfExists('namespaces'); + Schema::dropIfExists('ltm_namespaces'); } }