From 02bdfcf1261be8ae69298fbe27e7bd5647242565 Mon Sep 17 00:00:00 2001 From: Aidas Klimas Date: Fri, 5 Apr 2019 15:58:24 +0300 Subject: [PATCH 01/39] support comma separated groups --- src/LangListService.php | 48 +++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/LangListService.php b/src/LangListService.php index 5ba5b99..5caa897 100644 --- a/src/LangListService.php +++ b/src/LangListService.php @@ -5,23 +5,26 @@ use Lang; use File; -class LangListService +class LangListService { protected $dotFiles = ['routes']; /** * Load localization file or files for specified locale. - * + * * @param string $locale * @param string $group * @return array */ - public function loadLangList($locale, $group) + public function loadLangList($locale, $group) { $result = []; - if($this->isOneGroup($group)) { - $result[$group] = $this->getGroup($locale, $group); + if($this->isGroupList($group)) { + $groups = explode(',', $group); + foreach ($groups as $group) { + $result[$group] = $this->getGroup($locale, $group); + } return $result; } @@ -36,18 +39,18 @@ public function loadLangList($locale, $group) /** * Check if $group is one file only. - * + * * @param string $group * @return bool */ - private function isOneGroup($group) + private function isGroupList($group) { return $group != '*' && $group != ''; } /** * Fetch localization from file. - * + * * @param string $locale * @param string $group * @return array @@ -60,39 +63,38 @@ private function getGroup($locale, $group) /** * Get list of all files from $path. - * + * * @param string $path * @return array */ - private function getAllFiles($path) + private function getAllFiles($path) { return File::allFiles($path); } /** * Write translated content to localization file or files. - * + * * @param string $locale * @param string $group * @param array $new_translations * @return void */ - public function writeLangList($locale, $group, $new_translations) + public function writeLangList($locale, $group, $new_translations) { - if($this->isOneGroup($group)) { - if(isset($new_translations[$group]) == false) - return; - - return $this->writeLangFile($locale, $group, $new_translations[$group]); + if($this->isGroupList($group)) { + $groups = explode(',', $group); + $new_translations = array_intersect_key($new_translations, array_flip($groups)); } - foreach($new_translations as $group => $translations) - $this->writeLangFile($locale, $group, $translations); + foreach($new_translations as $group => $translations) { + $this->writeLangFile($locale, $group, $translations); + } } /** * Write translated content to one file. - * + * * @param string $locale * @param string $group * @param array $new_translations @@ -106,7 +108,7 @@ private function writeLangFile($locale, $group, $new_translations) $header = "load($locale, $group); + $translations = Lang::getLoader()->load($locale, $group); foreach($new_translations as $key => $value) { array_set($translations, $key, $value); } From 5aa5a9b700f422f0ac02189af5c1d69826544d0e Mon Sep 17 00:00:00 2001 From: Aidas Klimas Date: Fri, 5 Apr 2019 16:36:56 +0300 Subject: [PATCH 02/39] export only missing translations --- src/Console/ExportToCsvCommand.php | 67 +++++++++++++++++------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/src/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php index c6f337c..f7f201e 100644 --- a/src/Console/ExportToCsvCommand.php +++ b/src/Console/ExportToCsvCommand.php @@ -7,7 +7,7 @@ use Symfony\Component\Console\Input\InputArgument; use HighSolutions\LangImportExport\Facades\LangListService; -class ExportToCsvCommand extends Command +class ExportToCsvCommand extends Command { /** @@ -22,7 +22,8 @@ class ExportToCsvCommand extends Command {--A|append : Append name of group to the name of file (optional, default - empty).} {--X|excel : Set file encoding for Excel (optional, default - UTF-8).} {--D|delimiter=, : Field delimiter (optional, default - ",").} - {--E|enclosure=" : Field enclosure (optional, default - \'"\').} '; + {--E|enclosure=" : Field enclosure (optional, default - \'"\').} + {--T|target-locale=" : Target language, only missing keys are exported (optional).} '; /** * The console command description. @@ -33,28 +34,28 @@ class ExportToCsvCommand extends Command /** * Parameters provided to command. - * + * * @var array */ protected $parameters = []; /** * Default path for file save. - * + * * @var string */ protected $defaultPath; /** * File extension (default .csv). - * + * * @var string */ protected $ext = '.csv'; /** * Class constructor. - * + * * @return void */ public function __construct() @@ -70,7 +71,7 @@ public function __construct() */ public function handle() { - $this->getParameters(); + $this->getParameters(); $this->sayItsBeginning(); @@ -83,7 +84,7 @@ public function handle() /** * Fetch command parameters (arguments and options) and analyze them. - * + * * @return void */ private function getParameters() @@ -96,14 +97,15 @@ private function getParameters() 'excel' => $this->option('excel') !== false, 'delimiter' => $this->option('delimiter'), 'enclosure' => $this->option('enclosure'), - ]; + 'target_locale' => $this->option('target-locale'), + ]; - $this->setDefaultPath(); + $this->setDefaultPath(); } /** * Set possible file names. - * + * * @return void */ private function setDefaultPath() @@ -116,7 +118,7 @@ private function setDefaultPath() /** * Display output that command has started and which groups are being exported. - * + * * @return void */ private function sayItsBeginning() @@ -127,17 +129,26 @@ private function sayItsBeginning() /** * Get translations from localization files. - * + * * @return array */ private function getTranslations() { - return LangListService::loadLangList($this->parameters['locale'], $this->parameters['group']); - } + $from = LangListService::loadLangList($this->parameters['locale'], $this->parameters['group']); + if ($this->parameters['target_locale']) { + $target = LangListService::loadLangList($this->parameters['target_locale'], $this->parameters['group']); + foreach ($target as $group => $translations) { + foreach ($translations as $key => $v) { + unset($from[$group][$key]); + } + } + } + return $from; + } /** * Save fetched translations to file. - * + * * @return void */ private function saveTranslations($translations) @@ -151,7 +162,7 @@ private function saveTranslations($translations) /** * Open specified file (if not possible, open default one). - * + * * @return FilePointerResource */ private function openFile() @@ -162,15 +173,15 @@ private function openFile() if (!($output = fopen($this->parameters['output'], 'w'))) { $output = fopen($this->defaultPath . $this->ext, 'w'); } - + fputs($output, "\xEF\xBB\xBF"); - + return $output; } /** * Save content of translation files to specified file. - * + * * @param FilePointerResource $output * @param array $translations * @return void @@ -189,13 +200,13 @@ private function saveTranslationsToFile($output, $translations) /** * Put content of file to specified file with CSV parameters. - * + * * @param FilePointerResource $output * @param string $group * @param string $key * @param string $value * @return void - * + * */ private function writeFile() { @@ -206,7 +217,7 @@ private function writeFile() /** * Close output file and check if adjust file to Excel format. - * + * * @param FilePointerResource $output * @return void */ @@ -220,24 +231,24 @@ private function closeFile($output) /** * Adjust file to Excel format. - * + * * @return void - * + * */ private function adjustToExcel() { $data = file_get_contents($this->parameters['output']); - file_put_contents($this->parameters['output'], chr(255) . chr(254) . mb_convert_encoding($data, 'UTF-16LE', 'UTF-8')); + file_put_contents($this->parameters['output'], chr(255) . chr(254) . mb_convert_encoding($data, 'UTF-16LE', 'UTF-8')); } /** * Display output that command is finished and where to find file. - * + * * @return void */ private function sayItsFinish() { - $this->info('Finished! Translations saved to: '. (substr($this->parameters['output'], strlen(base_path()) + 1)) + $this->info('Finished! Translations saved to: '. (substr($this->parameters['output'], strlen(base_path()) + 1)) . PHP_EOL); } From 8fbda6253720327aa4f714e4692a0117acaf4902 Mon Sep 17 00:00:00 2001 From: Aidas Klimas Date: Tue, 18 Jun 2019 16:35:25 +0300 Subject: [PATCH 03/39] support of exporting multiple locales at once --- src/Console/ExportToCsvCommand.php | 74 ++++++++++++++++-------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/src/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php index f7f201e..10b58ec 100644 --- a/src/Console/ExportToCsvCommand.php +++ b/src/Console/ExportToCsvCommand.php @@ -18,7 +18,7 @@ class ExportToCsvCommand extends Command protected $signature = 'lang:export {locale? : The locale to be exported (default - default lang of application).} {group? : The name of translation file to export (default - all files).} - {output? : Filename of exported translation files (optional, default - storage/app/lang-import-export.csv).} + {output? : Filename of exported translation, :locale is replaced (optional, default - :locale-export.csv).} {--A|append : Append name of group to the name of file (optional, default - empty).} {--X|excel : Set file encoding for Excel (optional, default - UTF-8).} {--D|delimiter=, : Field delimiter (optional, default - ",").} @@ -61,7 +61,7 @@ class ExportToCsvCommand extends Command public function __construct() { parent::__construct(); - $this->defaultPath = storage_path('app'. DIRECTORY_SEPARATOR .'lang-import-export') . $this->ext; + $this->defaultPath = base_path(':locale-export') . $this->ext; } /** @@ -75,11 +75,11 @@ public function handle() $this->sayItsBeginning(); - $translations = $this->getTranslations(); - - $this->saveTranslations($translations); - - $this->sayItsFinish(); + foreach (explode(',', $this->parameters['locale']) as $locale) { + $translations = $this->getTranslations($locale); + $this->saveTranslations($locale, $translations); + $this->info(strtoupper($locale) . ' Translations saved to: ' . $this->getOutputFileName($locale)); + } } /** @@ -127,14 +127,15 @@ private function sayItsBeginning() . 'Translations export of '. ($this->parameters['group'] === null ? 'all groups' : $this->parameters['group'] .' group') .' - started.'); } - /** - * Get translations from localization files. - * - * @return array - */ - private function getTranslations() + /** + * Get translations from localization files. + * + * @param $locale + * @return array + */ + private function getTranslations($locale) { - $from = LangListService::loadLangList($this->parameters['locale'], $this->parameters['group']); + $from = LangListService::loadLangList($locale, $this->parameters['group']); if ($this->parameters['target_locale']) { $target = LangListService::loadLangList($this->parameters['target_locale'], $this->parameters['group']); foreach ($target as $group => $translations) { @@ -146,14 +147,16 @@ private function getTranslations() return $from; } - /** - * Save fetched translations to file. - * - * @return void - */ - private function saveTranslations($translations) + /** + * Save fetched translations to file. + * + * @param $locale + * @param $translations + * @return void + */ + private function saveTranslations($locale, $translations) { - $output = $this->openFile(); + $output = $this->openFile($locale); $this->saveTranslationsToFile($output, $translations); @@ -165,12 +168,13 @@ private function saveTranslations($translations) * * @return FilePointerResource */ - private function openFile() + private function openFile($locale) { - if(substr($this->parameters['output'], -4) != $this->ext) - $this->parameters['output'] .= $this->ext; + $fileName = $this->getOutputFileName($locale); + if(substr($fileName, -4) != $this->ext) + $fileName .= $this->ext; - if (!($output = fopen($this->parameters['output'], 'w'))) { + if (!($output = fopen($fileName, 'w'))) { $output = fopen($this->defaultPath . $this->ext, 'w'); } @@ -241,15 +245,15 @@ private function adjustToExcel() file_put_contents($this->parameters['output'], chr(255) . chr(254) . mb_convert_encoding($data, 'UTF-16LE', 'UTF-8')); } - /** - * Display output that command is finished and where to find file. - * - * @return void - */ - private function sayItsFinish() - { - $this->info('Finished! Translations saved to: '. (substr($this->parameters['output'], strlen(base_path()) + 1)) - . PHP_EOL); - } + /** + * @param $locale + * @return mixed + */ + private function getOutputFileName($locale) + { + $fileName = $this->parameters['output']; + $fileName = str_replace(':locale', $locale, $fileName); + return $fileName; + } } From 4702f591fba26989cf8c3d10f68bcbb366c59962 Mon Sep 17 00:00:00 2001 From: Aidas Klimas Date: Tue, 18 Jun 2019 16:37:49 +0300 Subject: [PATCH 04/39] psr2 formating --- src/Console/ExportToCsvCommand.php | 339 ++++++++++----------- src/Console/ImportFromCsvCommand.php | 386 ++++++++++++------------ src/Facades/LangListService.php | 13 +- src/LangImportExportServiceProvider.php | 107 +++---- src/LangListService.php | 257 ++++++++-------- src/Support/helpers.php | 5 +- 6 files changed, 557 insertions(+), 550 deletions(-) diff --git a/src/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php index 10b58ec..8a6e285 100644 --- a/src/Console/ExportToCsvCommand.php +++ b/src/Console/ExportToCsvCommand.php @@ -25,107 +25,107 @@ class ExportToCsvCommand extends Command {--E|enclosure=" : Field enclosure (optional, default - \'"\').} {--T|target-locale=" : Target language, only missing keys are exported (optional).} '; - /** - * The console command description. - * - * @var string - */ - protected $description = "Exports the language files to CSV file"; + /** + * The console command description. + * + * @var string + */ + protected $description = "Exports the language files to CSV file"; - /** - * Parameters provided to command. - * - * @var array - */ - protected $parameters = []; + /** + * Parameters provided to command. + * + * @var array + */ + protected $parameters = []; - /** - * Default path for file save. - * - * @var string - */ - protected $defaultPath; + /** + * Default path for file save. + * + * @var string + */ + protected $defaultPath; - /** - * File extension (default .csv). - * - * @var string - */ - protected $ext = '.csv'; + /** + * File extension (default .csv). + * + * @var string + */ + protected $ext = '.csv'; - /** - * Class constructor. - * - * @return void - */ - public function __construct() - { - parent::__construct(); - $this->defaultPath = base_path(':locale-export') . $this->ext; - } + /** + * Class constructor. + * + * @return void + */ + public function __construct() + { + parent::__construct(); + $this->defaultPath = base_path(':locale-export') . $this->ext; + } - /** - * Execute the console command. - * - * @return void - */ - public function handle() - { - $this->getParameters(); + /** + * Execute the console command. + * + * @return void + */ + public function handle() + { + $this->getParameters(); - $this->sayItsBeginning(); + $this->sayItsBeginning(); - foreach (explode(',', $this->parameters['locale']) as $locale) { + foreach (explode(',', $this->parameters['locale']) as $locale) { $translations = $this->getTranslations($locale); $this->saveTranslations($locale, $translations); $this->info(strtoupper($locale) . ' Translations saved to: ' . $this->getOutputFileName($locale)); } - } + } - /** - * Fetch command parameters (arguments and options) and analyze them. - * - * @return void - */ - private function getParameters() - { - $this->parameters = [ - 'group' => $this->argument('group'), - 'locale' => $this->argument('locale') === null ? config('app.locale') : $this->argument('locale'), - 'output' => $this->argument('output') === null ? $this->defaultPath : base_path($this->argument('output')), - 'append' => $this->option('append') !== false, - 'excel' => $this->option('excel') !== false, - 'delimiter' => $this->option('delimiter'), - 'enclosure' => $this->option('enclosure'), - 'target_locale' => $this->option('target-locale'), - ]; + /** + * Fetch command parameters (arguments and options) and analyze them. + * + * @return void + */ + private function getParameters() + { + $this->parameters = [ + 'group' => $this->argument('group'), + 'locale' => $this->argument('locale') === null ? config('app.locale') : $this->argument('locale'), + 'output' => $this->argument('output') === null ? $this->defaultPath : base_path($this->argument('output')), + 'append' => $this->option('append') !== false, + 'excel' => $this->option('excel') !== false, + 'delimiter' => $this->option('delimiter'), + 'enclosure' => $this->option('enclosure'), + 'target_locale' => $this->option('target-locale'), + ]; - $this->setDefaultPath(); - } + $this->setDefaultPath(); + } - /** - * Set possible file names. - * - * @return void - */ - private function setDefaultPath() - { - if($this->parameters['append']) { - $this->parameters['output'] .= '-'. $this->parameters['group']; - $this->defaultPath .= '-'. $this->parameters['group']; - } - } + /** + * Set possible file names. + * + * @return void + */ + private function setDefaultPath() + { + if ($this->parameters['append']) { + $this->parameters['output'] .= '-' . $this->parameters['group']; + $this->defaultPath .= '-' . $this->parameters['group']; + } + } - /** - * Display output that command has started and which groups are being exported. - * - * @return void - */ - private function sayItsBeginning() - { - $this->info(PHP_EOL - . 'Translations export of '. ($this->parameters['group'] === null ? 'all groups' : $this->parameters['group'] .' group') .' - started.'); - } + /** + * Display output that command has started and which groups are being exported. + * + * @return void + */ + private function sayItsBeginning() + { + $this->info(PHP_EOL + . 'Translations export of ' . ($this->parameters['group'] === null ? 'all groups' : $this->parameters['group'] . ' group') . ' - started.'); + } /** * Get translations from localization files. @@ -133,10 +133,10 @@ private function sayItsBeginning() * @param $locale * @return array */ - private function getTranslations($locale) - { - $from = LangListService::loadLangList($locale, $this->parameters['group']); - if ($this->parameters['target_locale']) { + private function getTranslations($locale) + { + $from = LangListService::loadLangList($locale, $this->parameters['group']); + if ($this->parameters['target_locale']) { $target = LangListService::loadLangList($this->parameters['target_locale'], $this->parameters['group']); foreach ($target as $group => $translations) { foreach ($translations as $key => $v) { @@ -154,96 +154,99 @@ private function getTranslations($locale) * @param $translations * @return void */ - private function saveTranslations($locale, $translations) - { - $output = $this->openFile($locale); + private function saveTranslations($locale, $translations) + { + $output = $this->openFile($locale); - $this->saveTranslationsToFile($output, $translations); + $this->saveTranslationsToFile($output, $translations); - $this->closeFile($output); - } + $this->closeFile($output); + } - /** - * Open specified file (if not possible, open default one). - * - * @return FilePointerResource - */ - private function openFile($locale) - { + /** + * Open specified file (if not possible, open default one). + * + * @return FilePointerResource + */ + private function openFile($locale) + { $fileName = $this->getOutputFileName($locale); - if(substr($fileName, -4) != $this->ext) - $fileName .= $this->ext; + if (substr($fileName, -4) != $this->ext) { + $fileName .= $this->ext; + } - if (!($output = fopen($fileName, 'w'))) { - $output = fopen($this->defaultPath . $this->ext, 'w'); - } + if (!($output = fopen($fileName, 'w'))) { + $output = fopen($this->defaultPath . $this->ext, 'w'); + } - fputs($output, "\xEF\xBB\xBF"); + fputs($output, "\xEF\xBB\xBF"); - return $output; - } + return $output; + } - /** - * Save content of translation files to specified file. - * - * @param FilePointerResource $output - * @param array $translations - * @return void - */ - private function saveTranslationsToFile($output, $translations) - { - foreach ($translations as $group => $files) { - foreach($files as $key => $value) { - if(is_array($value)) { - continue; - } - $this->writeFile($output, $group, $key, $value); - } - } - } + /** + * Save content of translation files to specified file. + * + * @param FilePointerResource $output + * @param array $translations + * @return void + */ + private function saveTranslationsToFile($output, $translations) + { + foreach ($translations as $group => $files) { + foreach ($files as $key => $value) { + if (is_array($value)) { + continue; + } + $this->writeFile($output, $group, $key, $value); + } + } + } - /** - * Put content of file to specified file with CSV parameters. - * - * @param FilePointerResource $output - * @param string $group - * @param string $key - * @param string $value - * @return void - * - */ - private function writeFile() - { - $data = func_get_args(); - $output = array_shift($data); - fputcsv($output, $data, $this->parameters['delimiter'], $this->parameters['enclosure']); - } + /** + * Put content of file to specified file with CSV parameters. + * + * @param FilePointerResource $output + * @param string $group + * @param string $key + * @param string $value + * @return void + * + */ + private function writeFile() + { + $data = func_get_args(); + $output = array_shift($data); + fputcsv($output, $data, $this->parameters['delimiter'], $this->parameters['enclosure']); + } - /** - * Close output file and check if adjust file to Excel format. - * - * @param FilePointerResource $output - * @return void - */ - private function closeFile($output) - { - fclose($output); + /** + * Close output file and check if adjust file to Excel format. + * + * @param FilePointerResource $output + * @return void + */ + private function closeFile($output) + { + fclose($output); - if($this->parameters['excel']) - $this->adjustToExcel(); - } + if ($this->parameters['excel']) { + $this->adjustToExcel(); + } + } - /** - * Adjust file to Excel format. - * - * @return void - * - */ - private function adjustToExcel() - { - $data = file_get_contents($this->parameters['output']); - file_put_contents($this->parameters['output'], chr(255) . chr(254) . mb_convert_encoding($data, 'UTF-16LE', 'UTF-8')); - } + /** + * Adjust file to Excel format. + * + * @return void + * + */ + private function adjustToExcel() + { + $data = file_get_contents($this->parameters['output']); + file_put_contents($this->parameters['output'], + chr(255) . chr(254) . mb_convert_encoding($data, 'UTF-16LE', 'UTF-8')); + } /** * @param $locale diff --git a/src/Console/ImportFromCsvCommand.php b/src/Console/ImportFromCsvCommand.php index a4e341b..9432ac1 100644 --- a/src/Console/ImportFromCsvCommand.php +++ b/src/Console/ImportFromCsvCommand.php @@ -7,7 +7,7 @@ use Symfony\Component\Console\Input\InputArgument; use HighSolutions\LangImportExport\Facades\LangListService; -class ImportFromCsvCommand extends Command +class ImportFromCsvCommand extends Command { /** @@ -15,7 +15,7 @@ class ImportFromCsvCommand extends Command * * @var string */ - protected $signature = 'lang:import + protected $signature = 'lang:import {locale? : The locale to be imported (default - default lang of application).} {group? : The name of translation file to imported (default - all files).} {input? : Filename of file to be imported with translation files(optional, default - storage/app/lang-import-export.csv).} @@ -24,191 +24,197 @@ class ImportFromCsvCommand extends Command {--C|escape=" : Field escape (optional, default - \'"\').} {--X|excel : Set file encoding from Excel (optional, default - UTF-8).}'; - /** - * The console command description. - * - * @var string - */ - protected $description = "Imports the CSV file and write content into language files."; - - /** - * Parameters provided to command. - * - * @var array - */ - protected $parameters = []; - - /** - * Default path for file read. - * - * @var string - */ - protected $defaultPath; - - /** - * File extension (default .csv). - * - * @var string - */ - protected $ext = '.csv'; - - /** - * Class constructor. - * - * @return void - */ - public function __construct() - { - parent::__construct(); - $this->defaultPath = storage_path('app'. DIRECTORY_SEPARATOR .'lang-import-export') . $this->ext; - } - - /** - * Execute the console command. - * - * @return void - */ - public function handle() - { - $this->getParameters(); - - $this->sayItsBeginning(); - - $translations = $this->getTranslations(); - - $this->saveTranslations($translations); - - $this->sayItsFinish(); - } - - /** - * Fetch command parameters (arguments and options) and analyze them. - * - * @return void - */ - private function getParameters() - { - $this->parameters = [ - 'locale' => $this->argument('locale') === null ? config('app.locale') : $this->argument('locale'), - 'group' => $this->argument('group'), - 'input' => $this->argument('input') === null ? $this->defaultPath : base_path($this->argument('input')), - 'delimiter' => $this->option('delimiter'), - 'enclosure' => $this->option('enclosure'), - 'escape' => $this->option('escape'), - 'excel' => $this->option('excel') !== false, - ]; - - if(substr($this->parameters['input'], -4) != $this->ext) - $this->parameters['input'] .= $this->ext; - } - - /** - * Display output that command has started and which groups are being imported. - * - * @return void - */ - private function sayItsBeginning() - { - $this->info(PHP_EOL - . 'Translations import of '. ($this->parameters['group'] === false ? 'all groups' : $this->parameters['group'] .' group') .' has started.'); - } - - /** - * Get translations from CSV file. - * - * @return array - */ - private function getTranslations() - { - $input = $this->openFile(); - - $translations = $this->readFile($input); - - $this->closeFile($input); - - return $translations; - } - - /** - * Opens file to read content. - * - * @return FileInputPointer - */ - private function openFile() - { - if (($input = fopen($this->parameters['input'], 'r')) === false) { - $this->error('Can\'t open the input file!'); - } - - return $input; - } - - /** - * Read content of file. - * - * @param FilePointer $input - * @throws \Exception - * @return array - */ - private function readFile($input) - { - if($this->parameters['excel']) - $this->adjustFromExcel(); - - $translations = []; - while (($data = fgetcsv($input, 0, $this->parameters['delimiter'], $this->parameters['enclosure'], $this->parameters['escape'])) !== false) { - if(isset($translations[$data[0]]) == false) - $translations[$data[0]] = []; - - if(sizeof($data) != 3) - throw new \Exception("Wrong format of file. Try launch command with -X option if you use Excel for editing file."); - - $translations[$data[0]][$data[1]] = $data[2]; - } - - return $translations; - } - - /** - * Adjust file to Excel format. - * - * @return void - */ - private function adjustFromExcel() - { - $data = file_get_contents($this->parameters['input']); - file_put_contents($this->parameters['input'], mb_convert_encoding($data, 'UTF-8', 'UTF-16')); - } - - /** - * Close file. - * - * @return void - */ - private function closeFile($input) - { - fclose($input); - } - - /** - * Save fetched translations to file. - * - * @return void - */ - private function saveTranslations($translations) - { - LangListService::writeLangList($this->parameters['locale'], $this->parameters['group'], $translations); - } - - /** - * Display output that command is finished and where to find file. - * - * @return void - */ - private function sayItsFinish() - { - $this->info('Finished! Translations imported from: '. (substr($this->parameters['input'], strlen(base_path()) + 1)) - . PHP_EOL); - } - -} \ No newline at end of file + /** + * The console command description. + * + * @var string + */ + protected $description = "Imports the CSV file and write content into language files."; + + /** + * Parameters provided to command. + * + * @var array + */ + protected $parameters = []; + + /** + * Default path for file read. + * + * @var string + */ + protected $defaultPath; + + /** + * File extension (default .csv). + * + * @var string + */ + protected $ext = '.csv'; + + /** + * Class constructor. + * + * @return void + */ + public function __construct() + { + parent::__construct(); + $this->defaultPath = storage_path('app' . DIRECTORY_SEPARATOR . 'lang-import-export') . $this->ext; + } + + /** + * Execute the console command. + * + * @return void + */ + public function handle() + { + $this->getParameters(); + + $this->sayItsBeginning(); + + $translations = $this->getTranslations(); + + $this->saveTranslations($translations); + + $this->sayItsFinish(); + } + + /** + * Fetch command parameters (arguments and options) and analyze them. + * + * @return void + */ + private function getParameters() + { + $this->parameters = [ + 'locale' => $this->argument('locale') === null ? config('app.locale') : $this->argument('locale'), + 'group' => $this->argument('group'), + 'input' => $this->argument('input') === null ? $this->defaultPath : base_path($this->argument('input')), + 'delimiter' => $this->option('delimiter'), + 'enclosure' => $this->option('enclosure'), + 'escape' => $this->option('escape'), + 'excel' => $this->option('excel') !== false, + ]; + + if (substr($this->parameters['input'], -4) != $this->ext) { + $this->parameters['input'] .= $this->ext; + } + } + + /** + * Display output that command has started and which groups are being imported. + * + * @return void + */ + private function sayItsBeginning() + { + $this->info(PHP_EOL + . 'Translations import of ' . ($this->parameters['group'] === false ? 'all groups' : $this->parameters['group'] . ' group') . ' has started.'); + } + + /** + * Get translations from CSV file. + * + * @return array + */ + private function getTranslations() + { + $input = $this->openFile(); + + $translations = $this->readFile($input); + + $this->closeFile($input); + + return $translations; + } + + /** + * Opens file to read content. + * + * @return FileInputPointer + */ + private function openFile() + { + if (($input = fopen($this->parameters['input'], 'r')) === false) { + $this->error('Can\'t open the input file!'); + } + + return $input; + } + + /** + * Read content of file. + * + * @param FilePointer $input + * @return array + * @throws \Exception + */ + private function readFile($input) + { + if ($this->parameters['excel']) { + $this->adjustFromExcel(); + } + + $translations = []; + while (($data = fgetcsv($input, 0, $this->parameters['delimiter'], $this->parameters['enclosure'], + $this->parameters['escape'])) !== false) { + if (isset($translations[$data[0]]) == false) { + $translations[$data[0]] = []; + } + + if (sizeof($data) != 3) { + throw new \Exception("Wrong format of file. Try launch command with -X option if you use Excel for editing file."); + } + + $translations[$data[0]][$data[1]] = $data[2]; + } + + return $translations; + } + + /** + * Adjust file to Excel format. + * + * @return void + */ + private function adjustFromExcel() + { + $data = file_get_contents($this->parameters['input']); + file_put_contents($this->parameters['input'], mb_convert_encoding($data, 'UTF-8', 'UTF-16')); + } + + /** + * Close file. + * + * @return void + */ + private function closeFile($input) + { + fclose($input); + } + + /** + * Save fetched translations to file. + * + * @return void + */ + private function saveTranslations($translations) + { + LangListService::writeLangList($this->parameters['locale'], $this->parameters['group'], $translations); + } + + /** + * Display output that command is finished and where to find file. + * + * @return void + */ + private function sayItsFinish() + { + $this->info('Finished! Translations imported from: ' . (substr($this->parameters['input'], + strlen(base_path()) + 1)) + . PHP_EOL); + } + +} diff --git a/src/Facades/LangListService.php b/src/Facades/LangListService.php index 855e4bf..66ee049 100644 --- a/src/Facades/LangListService.php +++ b/src/Facades/LangListService.php @@ -1,4 +1,5 @@ registerExportToCsvCommand(); - $this->registerImportFromCsvCommand(); - } + /** + * Bootstrap the application events. + * + * @return void + */ + public function boot() + { + $this->registerExportToCsvCommand(); + $this->registerImportFromCsvCommand(); + } - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $this->app->singleton('LangImportExportLangListService', function() { - return new LangListService; - }); - } + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->singleton('LangImportExportLangListService', function () { + return new LangListService; + }); + } - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return [ - 'lang-export.csv', 'lang-import.csv' - ]; - } + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return [ + 'lang-export.csv', + 'lang-import.csv' + ]; + } - private function registerExportToCsvCommand() - { - $this->app->singleton('lang-export.csv', function($app) { - return new ExportToCsvCommand(); - }); + private function registerExportToCsvCommand() + { + $this->app->singleton('lang-export.csv', function ($app) { + return new ExportToCsvCommand(); + }); - $this->commands('lang-export.csv'); - } + $this->commands('lang-export.csv'); + } - private function registerImportFromCsvCommand() - { - $this->app->singleton('lang-import.csv', function($app) { - return new ImportFromCsvCommand(); - }); + private function registerImportFromCsvCommand() + { + $this->app->singleton('lang-import.csv', function ($app) { + return new ImportFromCsvCommand(); + }); - $this->commands('lang-import.csv'); - } + $this->commands('lang-import.csv'); + } } diff --git a/src/LangListService.php b/src/LangListService.php index 5caa897..70f5a47 100644 --- a/src/LangListService.php +++ b/src/LangListService.php @@ -8,142 +8,139 @@ class LangListService { - protected $dotFiles = ['routes']; - - /** - * Load localization file or files for specified locale. - * - * @param string $locale - * @param string $group - * @return array - */ - public function loadLangList($locale, $group) - { - $result = []; - if($this->isGroupList($group)) { - $groups = explode(',', $group); - foreach ($groups as $group) { + protected $dotFiles = ['routes']; + + /** + * Load localization file or files for specified locale. + * + * @param string $locale + * @param string $group + * @return array + */ + public function loadLangList($locale, $group) + { + $result = []; + if ($this->isGroupList($group)) { + $groups = explode(',', $group); + foreach ($groups as $group) { $result[$group] = $this->getGroup($locale, $group); } - return $result; - } - - $path = resource_path('lang/'. $locale.'/'); - $files = $this->getAllFiles($path); - foreach($files as $file) { - $file_path = substr($file->getRealPath(), strlen($path), -4); - $result[$file_path] = $this->getGroup($locale, $file_path); - } - return $result; - } - - /** - * Check if $group is one file only. - * - * @param string $group - * @return bool - */ - private function isGroupList($group) - { - return $group != '*' && $group != ''; - } - - /** - * Fetch localization from file. - * - * @param string $locale - * @param string $group - * @return array - */ - private function getGroup($locale, $group) - { - $translations = Lang::getLoader()->load($locale, $group); - return array_dot($translations); - } - - /** - * Get list of all files from $path. - * - * @param string $path - * @return array - */ - private function getAllFiles($path) - { - return File::allFiles($path); - } - - /** - * Write translated content to localization file or files. - * - * @param string $locale - * @param string $group - * @param array $new_translations - * @return void - */ - public function writeLangList($locale, $group, $new_translations) - { - if($this->isGroupList($group)) { + return $result; + } + + $path = resource_path('lang/' . $locale . '/'); + $files = $this->getAllFiles($path); + foreach ($files as $file) { + $file_path = substr($file->getRealPath(), strlen($path), -4); + $result[$file_path] = $this->getGroup($locale, $file_path); + } + return $result; + } + + /** + * Check if $group is one file only. + * + * @param string $group + * @return bool + */ + private function isGroupList($group) + { + return $group != '*' && $group != ''; + } + + /** + * Fetch localization from file. + * + * @param string $locale + * @param string $group + * @return array + */ + private function getGroup($locale, $group) + { + $translations = Lang::getLoader()->load($locale, $group); + return array_dot($translations); + } + + /** + * Get list of all files from $path. + * + * @param string $path + * @return array + */ + private function getAllFiles($path) + { + return File::allFiles($path); + } + + /** + * Write translated content to localization file or files. + * + * @param string $locale + * @param string $group + * @param array $new_translations + * @return void + */ + public function writeLangList($locale, $group, $new_translations) + { + if ($this->isGroupList($group)) { $groups = explode(',', $group); $new_translations = array_intersect_key($new_translations, array_flip($groups)); - } + } - foreach($new_translations as $group => $translations) { + foreach ($new_translations as $group => $translations) { $this->writeLangFile($locale, $group, $translations); } - } - - /** - * Write translated content to one file. - * - * @param string $locale - * @param string $group - * @param array $new_translations - * @throws \Exception - * @return void - */ - private function writeLangFile($locale, $group, $new_translations) - { - $translations = $this->getTranslations($locale, $group, $new_translations); - - $header = "load($locale, $group); - foreach($new_translations as $key => $value) { - array_set($translations, $key, $value); - } - - if(in_array($group, $this->dotFiles)) { - $translations = array_dot($translations); - } - - return $translations; - } + } + + /** + * Write translated content to one file. + * + * @param string $locale + * @param string $group + * @param array $new_translations + * @return void + * @throws \Exception + */ + private function writeLangFile($locale, $group, $new_translations) + { + $translations = $this->getTranslations($locale, $group, $new_translations); + + $header = "load($locale, $group); + foreach ($new_translations as $key => $value) { + array_set($translations, $key, $value); + } + + if (in_array($group, $this->dotFiles)) { + $translations = array_dot($translations); + } + + return $translations; + } } diff --git a/src/Support/helpers.php b/src/Support/helpers.php index c18a3b8..145d576 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -1,11 +1,10 @@ Date: Tue, 18 Jun 2019 16:57:19 +0300 Subject: [PATCH 05/39] multi target locales support --- README.md | 4 +-- src/Console/ExportToCsvCommand.php | 52 ++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 95d1be9..f970f65 100644 --- a/README.md +++ b/README.md @@ -79,14 +79,14 @@ But there is few more useful parameters: | name of parameter | description | is required? | default value | |-------------------|-----------------------------------------|--------------|------------------------------------| -| locale | The locale to be exported | NO | default lang of application | +| locale | The locale to be exported. Multiple separated by comma | NO | default lang of application | | group | The name of translation file to export | NO | \* - all files | | output | Filename of exported translation files | NO | storage/app/lang-import-export.csv | | -A / --append | Append name of group to the name of file | NO | empty | | -X / --excel | Set file encoding (UTF-16) for Excel | NO | UTF-8 | | -D / --delimiter | Field delimiter | NO | , | | -E / --enclosure | Field enclosure | NO | " | - +| -T / --target-locale | Only missing keys for for this locale are exported | NO | " | ### Import ``` diff --git a/src/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php index 8a6e285..85e90cd 100644 --- a/src/Console/ExportToCsvCommand.php +++ b/src/Console/ExportToCsvCommand.php @@ -16,14 +16,14 @@ class ExportToCsvCommand extends Command * @var string */ protected $signature = 'lang:export - {locale? : The locale to be exported (default - default lang of application).} + {locale? : The locales to be exported. Separated by comma (default - default lang of application).} {group? : The name of translation file to export (default - all files).} - {output? : Filename of exported translation, :locale is replaced (optional, default - :locale-export.csv).} + {output? : Filename of exported translation, :locale, :target is replaced (optional, default - :locale:target-export.csv).} {--A|append : Append name of group to the name of file (optional, default - empty).} {--X|excel : Set file encoding for Excel (optional, default - UTF-8).} {--D|delimiter=, : Field delimiter (optional, default - ",").} {--E|enclosure=" : Field enclosure (optional, default - \'"\').} - {--T|target-locale=" : Target language, only missing keys are exported (optional).} '; + {--T|target-locale=" : Target languages, only missing keys are exported. Separated by comma (optional).} '; /** * The console command description. @@ -61,7 +61,7 @@ class ExportToCsvCommand extends Command public function __construct() { parent::__construct(); - $this->defaultPath = base_path(':locale-export') . $this->ext; + $this->defaultPath = base_path(':locale:target-export') . $this->ext; } /** @@ -75,13 +75,23 @@ public function handle() $this->sayItsBeginning(); - foreach (explode(',', $this->parameters['locale']) as $locale) { - $translations = $this->getTranslations($locale); - $this->saveTranslations($locale, $translations); - $this->info(strtoupper($locale) . ' Translations saved to: ' . $this->getOutputFileName($locale)); + foreach ($this->strToArray($this->parameters['locale']) as $locale) { + foreach ($this->strToArray($this->parameters['target_locale'], [null]) as $target) { + $translations = $this->getTranslations($locale, $target); + $this->saveTranslations($locale, $target, $translations); + $this->info(strtoupper($locale) . strtoupper($target ?: '') . ' Translations saved to: ' . $this->getOutputFileName($locale, $target)); + } } } + private function strToArray($string, $fallback = []) + { + if (!$string) { + return $fallback; + } + return array_filter(array_map('trim', explode(',', $string))); + } + /** * Fetch command parameters (arguments and options) and analyze them. * @@ -131,14 +141,15 @@ private function sayItsBeginning() * Get translations from localization files. * * @param $locale + * @param null $target * @return array */ - private function getTranslations($locale) + private function getTranslations($locale, $target = null) { $from = LangListService::loadLangList($locale, $this->parameters['group']); - if ($this->parameters['target_locale']) { - $target = LangListService::loadLangList($this->parameters['target_locale'], $this->parameters['group']); - foreach ($target as $group => $translations) { + if ($target) { + $targetList = LangListService::loadLangList($target, $this->parameters['group']); + foreach ($targetList as $group => $translations) { foreach ($translations as $key => $v) { unset($from[$group][$key]); } @@ -151,12 +162,13 @@ private function getTranslations($locale) * Save fetched translations to file. * * @param $locale + * @param $target * @param $translations * @return void */ - private function saveTranslations($locale, $translations) + private function saveTranslations($locale, $target, $translations) { - $output = $this->openFile($locale); + $output = $this->openFile($locale, $target); $this->saveTranslationsToFile($output, $translations); @@ -166,11 +178,13 @@ private function saveTranslations($locale, $translations) /** * Open specified file (if not possible, open default one). * + * @param $locale + * @param $target * @return FilePointerResource */ - private function openFile($locale) + private function openFile($locale, $target) { - $fileName = $this->getOutputFileName($locale); + $fileName = $this->getOutputFileName($locale, $target); if (substr($fileName, -4) != $this->ext) { $fileName .= $this->ext; } @@ -250,12 +264,16 @@ private function adjustToExcel() /** * @param $locale + * @param null $target * @return mixed */ - private function getOutputFileName($locale) + private function getOutputFileName($locale, $target = null) { $fileName = $this->parameters['output']; $fileName = str_replace(':locale', $locale, $fileName); + if ($target) { + $fileName = str_replace(':target', $target, $fileName); + } return $fileName; } From bcc242ccec185720c63ae53f1d20c351d80b2a2b Mon Sep 17 00:00:00 2001 From: Aidas Klimas Date: Mon, 5 Aug 2019 16:31:01 +0300 Subject: [PATCH 06/39] refactor --- LICENSE | 3 +- README.md | 50 +++----------- composer.json | 12 ++-- logo.png | Bin 0 -> 26170 bytes src/Console/ExportToCsvCommand.php | 87 +++++++----------------- src/Console/ImportFromCsvCommand.php | 4 +- src/Facades/LangListService.php | 2 +- src/LangImportExportServiceProvider.php | 53 ++++----------- src/LangListService.php | 2 +- src/config/lang_import_export.php | 9 +++ 10 files changed, 72 insertions(+), 150 deletions(-) create mode 100644 logo.png create mode 100644 src/config/lang_import_export.php diff --git a/LICENSE b/LICENSE index 02b6daf..47fe37a 100644 --- a/LICENSE +++ b/LICENSE @@ -2,6 +2,7 @@ The MIT License (MIT) Copyright (c) 2014 UFirst Group Copyright (c) 2017 HighSolutions +Copyright (c) 2019 Aidas Klimas Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +20,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/README.md b/README.md index f970f65..d0d1c2f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Laravel-Lang-Import-Export by HighSolutions](https://raw.githubusercontent.com/highsolutions/laravel-lang-import-export/master/intro.jpg) +![Laravel-Lang-Import-Export v6](https://raw.githubusercontent.com/AidasK/laravel-lang-import-export/master/logo.png) Laravel-Lang-Import-Export ========================== @@ -45,7 +45,7 @@ Add the following line to the `require` section of your Laravel webapp's `compos ```javascript "require": { - "HighSolutions/laravel-lang-import-export": "5.4.*" + "AidasK/laravel-lang-import-export": "6.0.*" } ``` @@ -57,7 +57,7 @@ For previous versions of Laravel, you need to update `config/app.php` by adding ```php 'providers' => array( /* ... */ - 'HighSolutions\LangImportExport\LangImportExportServiceProvider' + 'AidasK\LangImportExportServiceProvider' ) ``` @@ -69,47 +69,22 @@ The package currently provides two commands, one for exporting the files and one ### Export ```bash -php artisan lang:export -php artisan lang:export en * path/to/export -php artisan lang:export en auth -A -X +php artisan lang:export --locale en +php artisan lang:export --locale en --target fr # export en translations only missing in fr locale ``` -When you call command without parameters, export file will be generated for all localization files within default locale. But you can define **locale** explicitly. You can also export only one file (second parameter - **group**) and define where to store file (you can provide name with and without .csv extension). When you use **output** argument, default path is base_path() -> catalog of your whole project. -But there is few more useful parameters: - -| name of parameter | description | is required? | default value | -|-------------------|-----------------------------------------|--------------|------------------------------------| -| locale | The locale to be exported. Multiple separated by comma | NO | default lang of application | -| group | The name of translation file to export | NO | \* - all files | -| output | Filename of exported translation files | NO | storage/app/lang-import-export.csv | -| -A / --append | Append name of group to the name of file | NO | empty | -| -X / --excel | Set file encoding (UTF-16) for Excel | NO | UTF-8 | -| -D / --delimiter | Field delimiter | NO | , | -| -E / --enclosure | Field enclosure | NO | " | -| -T / --target-locale | Only missing keys for for this locale are exported | NO | " | ### Import ``` php artisan lang:import -php artisan lang:import en * path/to/import -php artisan lang:import en auth -X ``` -When you call command without parameters - it will try to read default file of export command without parameters for default locale and all localization files. You can of course specify all parameters (**locale**, **group**, **input**) and there is few more options: - -| name of parameter | description | is required? | default value | -|-------------------|----------------------------------------------|--------------|------------------------------------| -| locale | The locale to be imported | NO | default lang of application | -| group | The name of translation file to import | NO | * - all files | -| output | Filename of translation files to be imported | NO | storage/app/lang-import-export.csv | -| -X / --excel | Set file encoding from Excel | NO | UTF-8 | -| -D / --delimiter | Field delimiter | NO | , | -| -E / --enclosure | Field enclosure | NO | " | -| -C / --escape | Field escape | NO | \ | - Changelog ------------ +6.0.0 +* refactor whole repository + 5.4.10 * Laravel 5.7 support @@ -142,17 +117,10 @@ Changelog - add support for export and import all localization files - any arguments are not required -Roadmap ------------- - -* Removing tabs from text -* Option for deleting export file after importing. -* Option for excluding certain files (and system ones). -* Unit tests! Credits ------------ This package was originally created by [UFirst](http://github.com/ufirstgroup) and is available here: [Laravel-lang-import-export](https://github.com/ufirstgroup/laravel-lang-import-export). -Currently is developed by [HighSolutions](https://highsolutions.org), software house from Poland in love in Laravel. +Currently is developed by [Aidas Klimas](https://klimas.lt/), software house from Lithuania diff --git a/composer.json b/composer.json index 0425a76..0a6c03f 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,12 @@ { - "name": "highsolutions/laravel-lang-import-export", + "name": "AidasK/laravel-lang-import-export", "description": "A Laravel package providing artisan commands to import and export language files from and to CSV.", "keywords": ["laravel", "localization", "translation", "messages", "import", "export", "CSV"], "authors": [ + { + "name": "Aidas Klimas", + "email": "aidaskk@gmail.com" + }, { "name": "Michael Ruoss", "email": "michael.ruoss@UFirstgroup.com" @@ -19,7 +23,7 @@ }, "autoload": { "psr-4": { - "HighSolutions\\LangImportExport\\": "src/" + "LangImportExport\\": "src/" }, "files": [ "src/Support/helpers.php" @@ -30,8 +34,8 @@ "frameworks": ["Laravel 5.7"], "laravel": { "providers": [ - "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" - ] + "LangImportExport\\LangImportExportServiceProvider" + ] } }, "minimum-stability": "stable" diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9a73a9d3f4cdac27edb6303c56e6eb83f88774b2 GIT binary patch literal 26170 zcmeFYWl&sEv@Y1VySux4a0!Iq5Foe)f=h7sph1E=jRtpjC%C%?cWpxO=}zX>`*Gh) z&As(%=KYv13RdsE&RXBnz4tkX2vucSG-P6A004j{_g?w~0Dv$B0Kg(3!hlB-_@E^L z0H|11MGcwP*Vk#Kgqp?CdNlDM>;? z(%9J8*Vp&@^h`}n{by)2H8s`T+#CY~BRV?T*4Ea<#3V8@a)*RfKtN!5d3j-BVQ_HJ z(9lp`Uf$o|UshIDOiXNSY^e53^)hj%C+0zcDP4W-Sa>a<^S^Yx>T9DhHf{{mtx8vbb;&YtbdNN=<10K zSWCG!7Y?EzX`+A%c&uI$cc6ZnsV@!@>fWMXR}T^Qvb2W^=<#7M6cp7V8wGS@j$DaI z`9}@`BN!a9m&0156v=h`$jXn>reA&ps`CklXeN||PN4sI)|L-?m0C1M^x z7q4#ur+EjPRTQ9xFCQ-bz8{Sh7dxEZT1uqV;?Sg*cfvcRcnnnaFxA==!n2A1U?ZW; zT;~K}hV5LZ9RezZXkE5x0G8ugQnKXG0m&i^E}t<0^`;4`{lAGNzP@YyaFkq$AAr9$ zjw9sijS5h1kUv~nGjI=3Kf@7fLIc3AwfN+n0~lKH!}HNEpd_5{kTkWu-XU0?)8%5@ zcSG~?%NGv{0jg^T2lT|?0ZJlt8fFv#Ud}eT;$cPrqrm&(5lw*V=@7C|!!j(uzSHUI zBa}q07RBM*fiQs4`F-&OCxDS=TRGYfCII^+1epxl%SI$C21ecvhuH;ZN^57`w1#Jz z$u�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 literal 0 HcmV?d00001 diff --git a/src/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php index 85e90cd..0847b48 100644 --- a/src/Console/ExportToCsvCommand.php +++ b/src/Console/ExportToCsvCommand.php @@ -1,11 +1,11 @@ defaultPath = base_path(':locale:target-export') . $this->ext; - } - /** * Execute the console command. * @@ -73,10 +54,10 @@ public function handle() { $this->getParameters(); - $this->sayItsBeginning(); + $this->info('Translations export started.'); foreach ($this->strToArray($this->parameters['locale']) as $locale) { - foreach ($this->strToArray($this->parameters['target_locale'], [null]) as $target) { + foreach ($this->strToArray($this->parameters['target'], [null]) as $target) { $translations = $this->getTranslations($locale, $target); $this->saveTranslations($locale, $target, $translations); $this->info(strtoupper($locale) . strtoupper($target ?: '') . ' Translations saved to: ' . $this->getOutputFileName($locale, $target)); @@ -99,44 +80,25 @@ private function strToArray($string, $fallback = []) */ private function getParameters() { - $this->parameters = [ - 'group' => $this->argument('group'), - 'locale' => $this->argument('locale') === null ? config('app.locale') : $this->argument('locale'), - 'output' => $this->argument('output') === null ? $this->defaultPath : base_path($this->argument('output')), - 'append' => $this->option('append') !== false, - 'excel' => $this->option('excel') !== false, + $parameters = [ + 'locale' => $this->option('locale'), + 'group' => $this->option('group'), + 'output' => $this->option('output'), + 'append' => $this->option('append'), + 'excel' => $this->option('excel'), 'delimiter' => $this->option('delimiter'), 'enclosure' => $this->option('enclosure'), - 'target_locale' => $this->option('target-locale'), + 'target' => $this->option('target'), ]; - - $this->setDefaultPath(); - } - - /** - * Set possible file names. - * - * @return void - */ - private function setDefaultPath() - { + $parameters = array_filter($parameters, function ($var) { + return !is_null($var); + }); + $this->parameters = array_merge(config('lang_import_export.export'), $parameters); if ($this->parameters['append']) { $this->parameters['output'] .= '-' . $this->parameters['group']; - $this->defaultPath .= '-' . $this->parameters['group']; } } - /** - * Display output that command has started and which groups are being exported. - * - * @return void - */ - private function sayItsBeginning() - { - $this->info(PHP_EOL - . 'Translations export of ' . ($this->parameters['group'] === null ? 'all groups' : $this->parameters['group'] . ' group') . ' - started.'); - } - /** * Get translations from localization files. * @@ -180,7 +142,8 @@ private function saveTranslations($locale, $target, $translations) * * @param $locale * @param $target - * @return FilePointerResource + * @throws \Exception + * @return resource */ private function openFile($locale, $target) { @@ -190,7 +153,7 @@ private function openFile($locale, $target) } if (!($output = fopen($fileName, 'w'))) { - $output = fopen($this->defaultPath . $this->ext, 'w'); + throw new \Exception("$fileName failed to open"); } fputs($output, "\xEF\xBB\xBF"); @@ -201,7 +164,7 @@ private function openFile($locale, $target) /** * Save content of translation files to specified file. * - * @param FilePointerResource $output + * @param resource $output * @param array $translations * @return void */ diff --git a/src/Console/ImportFromCsvCommand.php b/src/Console/ImportFromCsvCommand.php index 9432ac1..b244da3 100644 --- a/src/Console/ImportFromCsvCommand.php +++ b/src/Console/ImportFromCsvCommand.php @@ -1,11 +1,11 @@ registerExportToCsvCommand(); - $this->registerImportFromCsvCommand(); + $this->publishes([ + __DIR__ . '/config/lang_import_export.php' => config_path('lang_import_export.php'), + ]); + if ($this->app->runningInConsole()) { + $this->commands([ + ImportFromCsvCommand::class, + ExportToCsvCommand::class, + ]); + } } /** @@ -34,40 +40,11 @@ public function boot() */ public function register() { + $this->mergeConfigFrom([ + __DIR__ . '/config/lang_import_export.php', 'lang_import_export' + ]); $this->app->singleton('LangImportExportLangListService', function () { return new LangListService; }); } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return [ - 'lang-export.csv', - 'lang-import.csv' - ]; - } - - private function registerExportToCsvCommand() - { - $this->app->singleton('lang-export.csv', function ($app) { - return new ExportToCsvCommand(); - }); - - $this->commands('lang-export.csv'); - } - - private function registerImportFromCsvCommand() - { - $this->app->singleton('lang-import.csv', function ($app) { - return new ImportFromCsvCommand(); - }); - - $this->commands('lang-import.csv'); - } - } diff --git a/src/LangListService.php b/src/LangListService.php index 70f5a47..e93f0fd 100644 --- a/src/LangListService.php +++ b/src/LangListService.php @@ -1,6 +1,6 @@ [ + // * for all or array + 'lang' => 'en', + 'groups' => '*', + 'output' => storage_path('/:locale:target.csv'), + ] +]; From 7f50ce5a6e820e3de582df669ee897067498ed14 Mon Sep 17 00:00:00 2001 From: Aidas Klimas Date: Mon, 5 Aug 2019 16:37:36 +0300 Subject: [PATCH 07/39] publish --- README.md | 4 ++-- composer.json | 2 +- intro.jpg | Bin 105719 -> 0 bytes 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 intro.jpg diff --git a/README.md b/README.md index d0d1c2f..5d335ab 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Add the following line to the `require` section of your Laravel webapp's `compos ```javascript "require": { - "AidasK/laravel-lang-import-export": "6.0.*" + "aidask/laravel-lang-import-export": "6.0.*" } ``` @@ -57,7 +57,7 @@ For previous versions of Laravel, you need to update `config/app.php` by adding ```php 'providers' => array( /* ... */ - 'AidasK\LangImportExportServiceProvider' + 'LangImportExport\LangImportExportServiceProvider' ) ``` diff --git a/composer.json b/composer.json index 0a6c03f..a1482a0 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "AidasK/laravel-lang-import-export", + "name": "aidask/laravel-lang-import-export", "description": "A Laravel package providing artisan commands to import and export language files from and to CSV.", "keywords": ["laravel", "localization", "translation", "messages", "import", "export", "CSV"], "authors": [ diff --git a/intro.jpg b/intro.jpg deleted file mode 100644 index da065498e1d1f76e75c61336ff77808e6a3c3233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105719 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