From e93c8a11c564c986d7836b3f000b492939247b35 Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Sat, 1 Apr 2017 18:40:44 +0200 Subject: [PATCH 01/23] fixes for support Laravel 5.4 --- .../LangImportExport/LangImportExportServiceProvider.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/UFirst/LangImportExport/LangImportExportServiceProvider.php b/src/UFirst/LangImportExport/LangImportExportServiceProvider.php index 8f0380f..7b85fd8 100644 --- a/src/UFirst/LangImportExport/LangImportExportServiceProvider.php +++ b/src/UFirst/LangImportExport/LangImportExportServiceProvider.php @@ -3,8 +3,6 @@ namespace UFirst\LangImportExport; use Illuminate\Support\ServiceProvider; -use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; - use UFirst\LangImportExport\Console\ExportToCsvCommand; use UFirst\LangImportExport\Console\ImportFromCsvCommand; @@ -22,9 +20,8 @@ class LangImportExportServiceProvider extends ServiceProvider { * * @return void */ - public function boot(DispatcherContract $events) + public function boot() { - parent::boot($events); $this->registerExportToCsvCommand(); $this->registerImportFromCsvCommand(); } @@ -52,7 +49,7 @@ public function provides() } private function registerExportToCsvCommand() { - $this->app['lang-export.csv'] = $this->app->share(function($app) + $this->app->singleton('lang-export.csv', function($app) { return new ExportToCsvCommand(); }); @@ -61,7 +58,7 @@ private function registerExportToCsvCommand() { } private function registerImportFromCsvCommand() { - $this->app['lang-import.csv'] = $this->app->share(function($app) + $this->app->singleton('lang-import.csv', function($app) { return new ImportFromCsvCommand(); }); From aa409454dc7c2ba97b9902bab2ff95504a73ec4f Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Sat, 1 Apr 2017 20:27:05 +0200 Subject: [PATCH 02/23] support for all lang files import/export --- .../Console/ExportToCsvCommand.php | 12 ++++- .../Console/ImportFromCsvCommand.php | 5 ++- .../LangImportExport/LangListService.php | 44 +++++++++++++++---- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/UFirst/LangImportExport/Console/ExportToCsvCommand.php b/src/UFirst/LangImportExport/Console/ExportToCsvCommand.php index 0b4236a..880ff48 100644 --- a/src/UFirst/LangImportExport/Console/ExportToCsvCommand.php +++ b/src/UFirst/LangImportExport/Console/ExportToCsvCommand.php @@ -72,10 +72,18 @@ public function fire() } // Write CSV lintes - foreach ($strings as $key => $value) { - fputcsv($out, array($key, $value), $delimiter, $enclosure); + foreach ($strings as $group => $files) { + foreach($files as $key => $value) { + $this->writeFile($out, $group, $key, $value, $delimiter, $enclosure); + } } fclose($out); } + + private function writeFile($out, $group, $key, $value, $delimiter, $enclosure) + { + fputcsv($out, array($group, $key, $value), $delimiter, $enclosure); + } + } \ No newline at end of file diff --git a/src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php b/src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php index be4bda1..85db2af 100644 --- a/src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php +++ b/src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php @@ -75,7 +75,10 @@ public function fire() // Write CSV lintes while (($data = fgetcsv($input_fp, 0, $delimiter, $enclosure, $escape)) !== FALSE) { - $strings[$data[0]] = $data[1]; + if(isset($strings[$data[0]]) == false) + $strings[$data[0]] = []; + + $strings[$data[0]][$data[1]] = $data[2]; } fclose($input_fp); diff --git a/src/UFirst/LangImportExport/LangListService.php b/src/UFirst/LangImportExport/LangListService.php index 38972cf..a6b18e8 100644 --- a/src/UFirst/LangImportExport/LangListService.php +++ b/src/UFirst/LangImportExport/LangListService.php @@ -3,26 +3,54 @@ namespace UFirst\LangImportExport; use Lang; +use File; -class LangListService { +class LangListService +{ - public function loadLangList($locale, $group) { + public function loadLangList($locale, $group) + { + $result = []; + if($group != '*') { + $result[$group] = $this->getGroup($locale, $group); + return $result; + } + + $path = resource_path('lang/'. $locale.'/'); + $files = File::allFiles($path); + foreach($files as $file) { + $file_path = substr($file->getRealPath(), strlen($path), -4); + $result[$file_path] = $this->getGroup($locale, $file_path); + } + return $result; + } + + private function getGroup($locale, $group) + { $translations = Lang::getLoader()->load($locale, $group); - $translations_with_prefix = array_dot(array($group => $translations)); - return $translations_with_prefix; + return array_dot($translations); } - public function writeLangList($locale, $group, $new_translations) { + public function writeLangList($locale, $group, $new_translations) + { + if($group != '*') + return $this->writeLangFile($locale, $group, $new_translations); + + foreach($new_translations as $group => $translations) + $this->writeLangFile($locale, $group, $translations); + } + + private function writeLangFile($locale, $group, $new_translations) + { $translations = Lang::getLoader()->load($locale, $group); foreach($new_translations as $key => $value) { array_set($translations, $key, $value); } $header = " Date: Mon, 10 Apr 2017 12:55:21 +0200 Subject: [PATCH 03/23] export command refactor --- .travis.yml | 11 +- LICENSE | 1 + README.md | 36 ++- composer.json | 17 +- public/.gitkeep | 0 .../Console/ExportToCsvCommand.php | 235 ++++++++++++++++++ .../Console/ImportFromCsvCommand.php | 159 ++++++++++++ .../Facades/LangListService.php | 7 +- .../LangImportExportServiceProvider.php | 25 +- .../LangImportExport/LangListService.php | 2 +- .../Console/ExportToCsvCommand.php | 89 ------- .../Console/ImportFromCsvCommand.php | 87 ------- src/bindings.php | 8 - src/config/.gitkeep | 0 src/controllers/.gitkeep | 0 src/lang/.gitkeep | 0 src/migrations/.gitkeep | 0 src/views/.gitkeep | 0 tests/.gitkeep | 0 19 files changed, 456 insertions(+), 221 deletions(-) delete mode 100644 public/.gitkeep create mode 100644 src/HighSolutions/LangImportExport/Console/ExportToCsvCommand.php create mode 100644 src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php rename src/{UFirst => HighSolutions}/LangImportExport/Facades/LangListService.php (56%) rename src/{UFirst => HighSolutions}/LangImportExport/LangImportExportServiceProvider.php (57%) rename src/{UFirst => HighSolutions}/LangImportExport/LangListService.php (97%) delete mode 100644 src/UFirst/LangImportExport/Console/ExportToCsvCommand.php delete mode 100644 src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php delete mode 100644 src/bindings.php delete mode 100644 src/config/.gitkeep delete mode 100644 src/controllers/.gitkeep delete mode 100644 src/lang/.gitkeep delete mode 100644 src/migrations/.gitkeep delete mode 100644 src/views/.gitkeep delete mode 100644 tests/.gitkeep diff --git a/.travis.yml b/.travis.yml index aa14ee5..28e2914 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,17 @@ language: php php: - - 5.3 - - 5.4 - - 5.5 - 5.6 - - hhvm + - 7.0 + +matrix: + include: + - php: 5.6 + env: 'COMPOSER_FLAGS="--prefer-stable --prefer-lowest"' before_script: - composer self-update - composer install --prefer-source --no-interaction --dev + - composer dump-autoload script: phpunit diff --git a/LICENSE b/LICENSE index 1cfd3c4..02b6daf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ The MIT License (MIT) Copyright (c) 2014 UFirst Group +Copyright (c) 2017 HighSolutions Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index df0b50f..80046a0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -laravel-lang-import-export +Laravel-Lang-Import-Export ========================== This package provides artisan commands to import and export language files from and to CSV. This can be used to send translations to agencies that normally work with Excel-like files. @@ -43,7 +43,7 @@ Add the following line to the `require` section of your Laravel webapp's `compos ```javascript "require": { - "ufirst/lang-import-export": "dev-master" + "HighSolutions/laravel-lang-import-export": "5.4.*" } ``` @@ -56,7 +56,7 @@ Finally add the following line to the `providers` array of your `app/config/app. ```php 'providers' => array( /* ... */ - 'UFirst\LangImportExport\LangImportExportServiceProvider' + 'HighSolutions\LangImportExport\LangImportExportServiceProvider' ) ``` @@ -68,19 +68,33 @@ The package currently provides two commands, one for exporting the files and one ### Export ```bash -php artisan lang-export:csv en_US navigation -php artisan lang-export:csv --output /some/file en_US navigation -php artisan lang-export:csv --delimiter=";" --enclosure='"' --output=/some/file en_US navigation +php artisan lang:export +php artisan lang:export en * --output=export +php artisan lang:export en auth --A --X ``` -You have to pass the __locale__ and the __group__ as arguments. The group is the name of the langauge file without its extension. You may define options for your desired CSV format. +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**). +But there is few more useful parameters: -### Import +| name of parameter | description | is required? | default value | +|-------------------|------------------------------------------|--------------|------------------------------------| +| locale | The locale to be exported | NO | default lang of application | +| group | The name of translation file to export | NO | \* - all files | +| --O / --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 for Excel | NO | UTF-8 | +| --D / --delimiter | Field delimiter | NO | , | +| --E / --enclosure | Field enclosure | NO | " | +### Import ``` -php artisan lang-import:csv en_US navigation /some/file -php artisan lang-import:csv --delimiter=";" --enclosure='"' --escape='\\' en_US navigation /some/file +php artisan lang-import:csv en auth /path/to/file +php artisan lang-import:csv --delimiter=";" --enclosure='"' --escape='\\' en_US auth /some/file ``` -You have to pass the __locale__, the __group__ and the __path to the CSV file__ as arguments. The group is the name of the langauge file without its extension. You may define options to match the CSV format of your input file. +You have to pass the __locale__, the __group__ and the __path to the CSV file__ as arguments. The group is the name of the langauge file without its extension. When you exported all files, write *. You may define options to match the CSV format of your input file. + +### 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). diff --git a/composer.json b/composer.json index e35b40f..568b85e 100644 --- a/composer.json +++ b/composer.json @@ -1,24 +1,25 @@ { - "name": "ufirst/lang-import-export", + "name": "highsolutions/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": "Michael Ruoss", - "email": "michael.ruoss@ufirstgroup.com" + "email": "michael.ruoss@UFirstgroup.com" + }, + { + "name": "HighSolutions", + "email": "adam@highsolutions.pl" } ], "license": "MIT", "require": { - "php": ">=5.3.0", + "php": ">=5.4.0", "illuminate/support": "~5.1" }, "autoload": { - "classmap": [ - "src/migrations" - ], - "psr-0": { - "UFirst\\LangImportExport\\": "src/" + "psr-4": { + "HighSolutions\\LangImportExport\\": "src/" } }, "extra": { diff --git a/public/.gitkeep b/public/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/HighSolutions/LangImportExport/Console/ExportToCsvCommand.php b/src/HighSolutions/LangImportExport/Console/ExportToCsvCommand.php new file mode 100644 index 0000000..a49d0ec --- /dev/null +++ b/src/HighSolutions/LangImportExport/Console/ExportToCsvCommand.php @@ -0,0 +1,235 @@ +defaultPath = storage_path('app'. DIRECTORY_SEPARATOR .'lang-import-export'); + } + + /** + * 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 = [ + 'group' => $this->argument('group'), + 'locale' => $this->argument('locale') === false ? config('app.locale') : $this->argument('locale'), + 'output' => $this->option('output') === false ? $this->defaultPath : base_path($this->option('output')), + 'append' => $this->option('append') !== false, + 'excel' => $this->option('excel') !== false, + 'delimiter' => $this->option('delimiter'), + 'enclosure' => $this->option('enclosure'), + ]; + + $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']; + } + } + + /** + * 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'] === false ? 'all groups' : $this->parameters['group'] .' group') .' has started.'); + } + + /** + * Get translations from localization files. + * + * @return array + */ + private function getTranslations() + { + return LangListService::loadLangList($this->parameters['locale'], $this->parameters['group']); + } + + /** + * Save fetched translations to file. + * + * @return void + */ + private function saveTranslations($translations) + { + $output = $this->openFile(); + + $this->saveTranslationsToFile($output, $translations); + + $this->closeFile($output); + } + + /** + * Open specified file (if not possible, open default one). + * + * @return FilePointerResource + */ + private function openFile() + { + if (!($output = fopen($this->parameters['output'] . $this->ext, 'w'))) { + $output = fopen($this->defaultPath . $this->ext, 'w'); + } + 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) { + $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']); + } + + /** + * 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(); + } + + /** + * Adjust file to Excel format. + * + * @return void + * + */ + private function adjustToExcel() + { + $data = file_get_contents($this->parameters['output'] . $this->ext); + file_put_contents($this->parameters['output'] . $this->ext, 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->ext + . PHP_EOL); + } + +} \ No newline at end of file diff --git a/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php b/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php new file mode 100644 index 0000000..07ae3a5 --- /dev/null +++ b/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php @@ -0,0 +1,159 @@ +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 = [ + 'group' => $this->argument('group'), + 'locale' => $this->argument('locale') === false ? config('app.locale') : $this->argument('locale'), + 'input' => $this->option('input') === false ? $this->defaultPath : base_path($this->option('input')), + 'delimiter' => $this->option('delimiter'), + 'enclosure' => $this->option('enclosure'), + 'escape' => $this->option('escape'), + ]; + } + + /** + * 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() + { + $translations = []; + + // Create output device and write CSV. + if (($input_fp = fopen($this->parameters['input'], 'r')) === false) { + $this->error('Can\'t open the input file!'); + } + + // Write CSV lintes + while (($data = fgetcsv($input_fp, 0, $this->parameters['delimiter'], $this->parameters['enclosure'], $this->parameters['escape'])) !== false) { + if(isset($translations[$data[0]]) == false) + $translations[$data[0]] = []; + + $translations[$data[0]][$data[1]] = $data[2]; + } + + fclose($input_fp); + + return $translations; + } + + /** + * Save fetched translations to file. + * + * @return void + */ + private function saveTranslations($translations) + { + LangListService::writeLangList($locale, $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['output'], strlen(base_path()) + 1)) . $this->ext + . PHP_EOL); + } + +} \ No newline at end of file diff --git a/src/UFirst/LangImportExport/Facades/LangListService.php b/src/HighSolutions/LangImportExport/Facades/LangListService.php similarity index 56% rename from src/UFirst/LangImportExport/Facades/LangListService.php rename to src/HighSolutions/LangImportExport/Facades/LangListService.php index 5ed0c36..855e4bf 100644 --- a/src/UFirst/LangImportExport/Facades/LangListService.php +++ b/src/HighSolutions/LangImportExport/Facades/LangListService.php @@ -1,11 +1,14 @@ app->singleton('LangImportExportLangListService', function() { + return new LangListService; + }); } /** @@ -48,18 +51,18 @@ public function provides() ]; } - private function registerExportToCsvCommand() { - $this->app->singleton('lang-export.csv', function($app) - { + 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) - { + private function registerImportFromCsvCommand() + { + $this->app->singleton('lang-import.csv', function($app) { return new ImportFromCsvCommand(); }); diff --git a/src/UFirst/LangImportExport/LangListService.php b/src/HighSolutions/LangImportExport/LangListService.php similarity index 97% rename from src/UFirst/LangImportExport/LangListService.php rename to src/HighSolutions/LangImportExport/LangListService.php index a6b18e8..83eea6e 100644 --- a/src/UFirst/LangImportExport/LangListService.php +++ b/src/HighSolutions/LangImportExport/LangListService.php @@ -1,6 +1,6 @@ argument('locale'); - $group = $this->argument('group'); - - $delimiter = $this->option('delimiter'); - $enclosure = $this->option('enclosure'); - - $strings = LangListService::loadLangList($locale, $group); - - // Create output device and write CSV. - $output = $this->option('output'); - if (empty($output) || !($out = fopen($output, 'w'))) { - $out = fopen('php://output', 'w'); - } - - // Write CSV lintes - foreach ($strings as $group => $files) { - foreach($files as $key => $value) { - $this->writeFile($out, $group, $key, $value, $delimiter, $enclosure); - } - } - - fclose($out); - } - - private function writeFile($out, $group, $key, $value, $delimiter, $enclosure) - { - fputcsv($out, array($group, $key, $value), $delimiter, $enclosure); - } - -} \ No newline at end of file diff --git a/src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php b/src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php deleted file mode 100644 index 85db2af..0000000 --- a/src/UFirst/LangImportExport/Console/ImportFromCsvCommand.php +++ /dev/null @@ -1,87 +0,0 @@ -argument('locale'); - $group = $this->argument('group'); - $file = $this->argument('file'); - - $delimiter = $this->option('delimiter'); - $enclosure = $this->option('enclosure'); - $escape = $this->option('escape'); - - $strings = array(); - - // Create output device and write CSV. - if (($input_fp = fopen($file, 'r')) === FALSE) { - $this->error('Can\'t open the input file!'); - } - - // Write CSV lintes - while (($data = fgetcsv($input_fp, 0, $delimiter, $enclosure, $escape)) !== FALSE) { - if(isset($strings[$data[0]]) == false) - $strings[$data[0]] = []; - - $strings[$data[0]][$data[1]] = $data[2]; - } - - fclose($input_fp); - LangListService::writeLangList($locale, $group, $strings); - } -} \ No newline at end of file diff --git a/src/bindings.php b/src/bindings.php deleted file mode 100644 index a80750c..0000000 --- a/src/bindings.php +++ /dev/null @@ -1,8 +0,0 @@ - Date: Tue, 11 Apr 2017 11:07:08 +0200 Subject: [PATCH 04/23] import command refactor --- README.md | 67 +++++++++--- composer.json | 2 +- intro.jpg | Bin 0 -> 105719 bytes .../Console/ExportToCsvCommand.php | 27 ++--- .../Console/ImportFromCsvCommand.php | 85 +++++++++++++--- .../LangImportExport/LangListService.php | 95 ++++++++++++++++-- 6 files changed, 224 insertions(+), 52 deletions(-) create mode 100644 intro.jpg diff --git a/README.md b/README.md index 80046a0..d258cbe 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![Laravel-Lang-Import-Export by HighSolutions](https://raw.githubusercontent.com/highsolutions/laravel-lang-import-export/master/intro.jpg) + Laravel-Lang-Import-Export ========================== @@ -69,32 +71,65 @@ The package currently provides two commands, one for exporting the files and one ```bash php artisan lang:export -php artisan lang:export en * --output=export -php artisan lang:export en auth --A --X +php artisan lang:export en * path/to/export +php artisan lang:export en auth -A -X ``` -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**). +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 | NO | default lang of application | -| group | The name of translation file to export | NO | \* - all files | -| --O / --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 for Excel | NO | UTF-8 | -| --D / --delimiter | Field delimiter | NO | , | -| --E / --enclosure | Field enclosure | NO | " | +| name of parameter | description | is required? | default value | +|-------------------|-----------------------------------------|--------------|------------------------------------| +| locale | The locale to be exported | 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 | " | ### Import ``` -php artisan lang-import:csv en auth /path/to/file -php artisan lang-import:csv --delimiter=";" --enclosure='"' --escape='\\' en_US auth /some/file +php artisan lang:import +php artisan lang:import en * path/to/import +php artisan lang:import en auth -X ``` -You have to pass the __locale__, the __group__ and the __path to the CSV file__ as arguments. The group is the name of the langauge file without its extension. When you exported all files, write *. You may define options to match the CSV format of your input file. +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 +------------ +5.4.1 +- improved Excel support +- support of [LaravelLocalization](https://github.com/mcamara/laravel-localization) routes files + +5.4.0 +- refactor whole repository +- add support for Excel +- add support for export and import all localization files +- any arguments are not required -### Credits +Roadmap +------------ + +* 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](http://highsolutions.pl), software house from Poland in love in Laravel. diff --git a/composer.json b/composer.json index 568b85e..a43d7a5 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ ], "license": "MIT", "require": { - "php": ">=5.4.0", + "php": ">=5.6.4", "illuminate/support": "~5.1" }, "autoload": { diff --git a/intro.jpg b/intro.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da065498e1d1f76e75c61336ff77808e6a3c3233 GIT binary patch literal 105719 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 = storage_path('app'. DIRECTORY_SEPARATOR .'lang-import-export') . $this->ext; } /** @@ -90,8 +90,8 @@ private function getParameters() { $this->parameters = [ 'group' => $this->argument('group'), - 'locale' => $this->argument('locale') === false ? config('app.locale') : $this->argument('locale'), - 'output' => $this->option('output') === false ? $this->defaultPath : base_path($this->option('output')), + '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'), @@ -122,7 +122,7 @@ private function setDefaultPath() private function sayItsBeginning() { $this->info(PHP_EOL - . 'Translations export of '. ($this->parameters['group'] === false ? 'all groups' : $this->parameters['group'] .' group') .' has started.'); + . 'Translations export of '. ($this->parameters['group'] === null ? 'all groups' : $this->parameters['group'] .' group') .' - started.'); } /** @@ -156,7 +156,10 @@ private function saveTranslations($translations) */ private function openFile() { - if (!($output = fopen($this->parameters['output'] . $this->ext, 'w'))) { + if(substr($this->parameters['output'], -4) != $this->ext) + $this->parameters['output'] .= $this->ext; + + if (!($output = fopen($this->parameters['output'], 'w'))) { $output = fopen($this->defaultPath . $this->ext, 'w'); } return $output; @@ -217,8 +220,8 @@ private function closeFile($output) */ private function adjustToExcel() { - $data = file_get_contents($this->parameters['output'] . $this->ext); - file_put_contents($this->parameters['output'] . $this->ext, chr(255) . chr(254) . mb_convert_encoding($data, 'UTF-16LE', 'UTF-8')); + $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')); } /** @@ -228,7 +231,7 @@ private function adjustToExcel() */ private function sayItsFinish() { - $this->info('Finished! Translations saved to: '. (substr($this->parameters['output'], strlen(base_path()) + 1)) . $this->ext + $this->info('Finished! Translations saved to: '. (substr($this->parameters['output'], strlen(base_path()) + 1)) . PHP_EOL); } diff --git a/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php b/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php index 07ae3a5..a4e341b 100644 --- a/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php +++ b/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php @@ -16,12 +16,13 @@ class ImportFromCsvCommand extends Command * @var string */ 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).} - {--I|input= : Filename of file to be imported with translation files(optional, default - storage/app/lang-import-export.csv).} + {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).} {--D|delimiter=, : Field delimiter (optional, default - ",").} {--E|enclosure=" : Field enclosure (optional, default - \'"\').} - {--C|escape=\\" : Field excape (optional, default - \'\\\').}'; + {--C|escape=" : Field escape (optional, default - \'"\').} + {--X|excel : Set file encoding from Excel (optional, default - UTF-8).}'; /** * The console command description. @@ -88,13 +89,17 @@ public function handle() private function getParameters() { $this->parameters = [ + 'locale' => $this->argument('locale') === null ? config('app.locale') : $this->argument('locale'), 'group' => $this->argument('group'), - 'locale' => $this->argument('locale') === false ? config('app.locale') : $this->argument('locale'), - 'input' => $this->option('input') === false ? $this->defaultPath : base_path($this->option('input')), + '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; } /** @@ -115,26 +120,76 @@ private function sayItsBeginning() */ private function getTranslations() { - $translations = []; + $input = $this->openFile(); + + $translations = $this->readFile($input); - // Create output device and write CSV. - if (($input_fp = fopen($this->parameters['input'], 'r')) === false) { + $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!'); } - // Write CSV lintes - while (($data = fgetcsv($input_fp, 0, $this->parameters['delimiter'], $this->parameters['enclosure'], $this->parameters['escape'])) !== false) { + 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]; } - fclose($input_fp); - 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. * @@ -142,7 +197,7 @@ private function getTranslations() */ private function saveTranslations($translations) { - LangListService::writeLangList($locale, $group, $translations); + LangListService::writeLangList($this->parameters['locale'], $this->parameters['group'], $translations); } /** @@ -152,7 +207,7 @@ private function saveTranslations($translations) */ private function sayItsFinish() { - $this->info('Finished! Translations imported from: '. (substr($this->parameters['output'], strlen(base_path()) + 1)) . $this->ext + $this->info('Finished! Translations imported from: '. (substr($this->parameters['input'], strlen(base_path()) + 1)) . PHP_EOL); } diff --git a/src/HighSolutions/LangImportExport/LangListService.php b/src/HighSolutions/LangImportExport/LangListService.php index 83eea6e..022bbce 100644 --- a/src/HighSolutions/LangImportExport/LangListService.php +++ b/src/HighSolutions/LangImportExport/LangListService.php @@ -8,16 +8,25 @@ 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($group != '*') { + if($this->isOneGroup($group)) { $result[$group] = $this->getGroup($locale, $group); return $result; } $path = resource_path('lang/'. $locale.'/'); - $files = File::allFiles($path); + $files = $this->getAllFiles($path); foreach($files as $file) { $file_path = substr($file->getRealPath(), strlen($path), -4); $result[$file_path] = $this->getGroup($locale, $file_path); @@ -25,27 +34,75 @@ public function loadLangList($locale, $group) return $result; } + /** + * Check if $group is one file only. + * + * @param string $group + * @return bool + */ + private function isOneGroup($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($group != '*') - return $this->writeLangFile($locale, $group, $new_translations); + if($this->isOneGroup($group)) { + if(isset($new_translations[$group]) == false) + return; + + return $this->writeLangFile($locale, $group, $new_translations[$group]); + } 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 = Lang::getLoader()->load($locale, $group); - foreach($new_translations as $key => $value) { - array_set($translations, $key, $value); - } + $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; + } + } From 87d0e002694b7c93401a513aee8f049d9650afb3 Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Tue, 11 Apr 2017 12:08:06 +0200 Subject: [PATCH 05/23] PSR-4 fixes --- README.md | 4 ++++ .../LangImportExport => }/Console/ExportToCsvCommand.php | 0 .../LangImportExport => }/Console/ImportFromCsvCommand.php | 0 .../LangImportExport => }/Facades/LangListService.php | 0 .../LangImportExport => }/LangImportExportServiceProvider.php | 0 src/{HighSolutions/LangImportExport => }/LangListService.php | 0 6 files changed, 4 insertions(+) rename src/{HighSolutions/LangImportExport => }/Console/ExportToCsvCommand.php (100%) rename src/{HighSolutions/LangImportExport => }/Console/ImportFromCsvCommand.php (100%) rename src/{HighSolutions/LangImportExport => }/Facades/LangListService.php (100%) rename src/{HighSolutions/LangImportExport => }/LangImportExportServiceProvider.php (100%) rename src/{HighSolutions/LangImportExport => }/LangListService.php (100%) diff --git a/README.md b/README.md index d258cbe..f609e88 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,11 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ +5.4.2 +- resolve problems with PSR-4 autoloading + 5.4.1 +- improved import command - improved Excel support - support of [LaravelLocalization](https://github.com/mcamara/laravel-localization) routes files diff --git a/src/HighSolutions/LangImportExport/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php similarity index 100% rename from src/HighSolutions/LangImportExport/Console/ExportToCsvCommand.php rename to src/Console/ExportToCsvCommand.php diff --git a/src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php b/src/Console/ImportFromCsvCommand.php similarity index 100% rename from src/HighSolutions/LangImportExport/Console/ImportFromCsvCommand.php rename to src/Console/ImportFromCsvCommand.php diff --git a/src/HighSolutions/LangImportExport/Facades/LangListService.php b/src/Facades/LangListService.php similarity index 100% rename from src/HighSolutions/LangImportExport/Facades/LangListService.php rename to src/Facades/LangListService.php diff --git a/src/HighSolutions/LangImportExport/LangImportExportServiceProvider.php b/src/LangImportExportServiceProvider.php similarity index 100% rename from src/HighSolutions/LangImportExport/LangImportExportServiceProvider.php rename to src/LangImportExportServiceProvider.php diff --git a/src/HighSolutions/LangImportExport/LangListService.php b/src/LangListService.php similarity index 100% rename from src/HighSolutions/LangImportExport/LangListService.php rename to src/LangListService.php From 4a6246a6456d9a957b33f8a46867f6c2b9da7a2c Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Wed, 27 Sep 2017 09:59:57 +0200 Subject: [PATCH 06/23] 5.4.3 Package Auto-Discovery --- README.md | 12 ++++++++---- composer.json | 7 ++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f609e88..a0f4375 100644 --- a/README.md +++ b/README.md @@ -49,11 +49,10 @@ Add the following line to the `require` section of your Laravel webapp's `compos } ``` - Run `composer update` to install the package. - -Finally add the following line to the `providers` array of your `app/config/app.php` file: +This package uses Laravel 5.5 Package Auto-Discovery. +For previous versions of Laravel, you need to update `config/app.php` by adding an entry for the service provider: ```php 'providers' => array( @@ -110,6 +109,10 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ + +5.4.3 +- support Package Auto-Discovery + 5.4.2 - resolve problems with PSR-4 autoloading @@ -127,6 +130,7 @@ Changelog Roadmap ------------ +* Removing tabs from text * Option for deleting export file after importing. * Option for excluding certain files (and system ones). * Unit tests! @@ -136,4 +140,4 @@ 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](http://highsolutions.pl), software house from Poland in love in Laravel. +Currently is developed by [HighSolutions](https://highsolutions.org), software house from Poland in love in Laravel. diff --git a/composer.json b/composer.json index a43d7a5..56af1cf 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,12 @@ }, "extra": { "component": "package", - "frameworks": ["Laravel 5"] + "frameworks": ["Laravel 5.5"], + "laravel": { + "providers": [ + "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" + ] + } }, "minimum-stability": "stable" } From 1a4c931c757601caa285f53569e01ca874e85a48 Mon Sep 17 00:00:00 2001 From: Quentin Bontemps Date: Wed, 7 Mar 2018 12:53:03 +0100 Subject: [PATCH 07/23] Add compatibility with laravel 5.1 --- composer.json | 5 ++++- src/Support/helpers.php | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/Support/helpers.php diff --git a/composer.json b/composer.json index 56af1cf..0d8c14b 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,10 @@ "autoload": { "psr-4": { "HighSolutions\\LangImportExport\\": "src/" - } + }, + "files": [ + "src/Support/helpers.php" + ] }, "extra": { "component": "package", diff --git a/src/Support/helpers.php b/src/Support/helpers.php new file mode 100644 index 0000000..5533f2e --- /dev/null +++ b/src/Support/helpers.php @@ -0,0 +1,15 @@ + Date: Wed, 7 Mar 2018 13:06:54 +0100 Subject: [PATCH 08/23] fixe helpers resource_path() --- src/Support/helpers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Support/helpers.php b/src/Support/helpers.php index 5533f2e..52ed3d7 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -10,6 +10,6 @@ */ function resource_path($path = '') { - return \Illuminate\Support\Facades\App::basePath('resources' . ($path ? DIRECTORY_SEPARATOR . $path : $path)); + return \Illuminate\Support\Facades\App::basePath() . DIRECTORY_SEPARATOR . 'resources' . ($path ? DIRECTORY_SEPARATOR . $path : $path); } } \ No newline at end of file From 6bac44fd083c74e6a597cd56fa22a91b290f194a Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 14 Mar 2018 13:11:12 +0100 Subject: [PATCH 09/23] Update helpers.php To make the helper work correct in the latest laravel --- src/Support/helpers.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Support/helpers.php b/src/Support/helpers.php index 52ed3d7..c18a3b8 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -10,6 +10,6 @@ */ function resource_path($path = '') { - return \Illuminate\Support\Facades\App::basePath() . DIRECTORY_SEPARATOR . 'resources' . ($path ? DIRECTORY_SEPARATOR . $path : $path); + return app()->basePath() . DIRECTORY_SEPARATOR . 'resources' . ($path ? DIRECTORY_SEPARATOR . $path : $path); } -} \ No newline at end of file +} From ebe87c66341b4a6b189e4235b2520a555ae56c6d Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Wed, 18 Apr 2018 15:39:17 +0200 Subject: [PATCH 10/23] L5.6 support --- README.md | 3 +++ composer.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a0f4375..7cebd2e 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,9 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ +5.4.4 +* Laravel 5.6 support + 5.4.3 - support Package Auto-Discovery diff --git a/composer.json b/composer.json index 56af1cf..9ed2932 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "license": "MIT", "require": { "php": ">=5.6.4", - "illuminate/support": "~5.1" + "illuminate/support": "5.0.x|5.1.x|5.2.x|5.3.x|5.4.x|5.5.x|5.6.x" }, "autoload": { "psr-4": { @@ -24,7 +24,7 @@ }, "extra": { "component": "package", - "frameworks": ["Laravel 5.5"], + "frameworks": ["Laravel 5.6"], "laravel": { "providers": [ "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" From 371039a5628935cbb5a0f17dc3b75f323295c725 Mon Sep 17 00:00:00 2001 From: Quentin Bontemps Date: Fri, 29 Jun 2018 12:39:52 +0200 Subject: [PATCH 11/23] Fixe error "Array to string conversion" Error throwed when : ... 'key' => [], ... --- src/Console/ExportToCsvCommand.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php index 45fb098..f0d6581 100644 --- a/src/Console/ExportToCsvCommand.php +++ b/src/Console/ExportToCsvCommand.php @@ -176,6 +176,9 @@ 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); } } @@ -235,4 +238,4 @@ private function sayItsFinish() . PHP_EOL); } -} \ No newline at end of file +} From 8ada981e94e767749df90f7424d9bec75fbf0310 Mon Sep 17 00:00:00 2001 From: Quentin Bontemps Date: Mon, 9 Jul 2018 15:05:03 +0200 Subject: [PATCH 12/23] Fixe Excel UTF8 encode --- src/Console/ExportToCsvCommand.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Console/ExportToCsvCommand.php b/src/Console/ExportToCsvCommand.php index f0d6581..c6f337c 100644 --- a/src/Console/ExportToCsvCommand.php +++ b/src/Console/ExportToCsvCommand.php @@ -162,6 +162,9 @@ private function openFile() if (!($output = fopen($this->parameters['output'], 'w'))) { $output = fopen($this->defaultPath . $this->ext, 'w'); } + + fputs($output, "\xEF\xBB\xBF"); + return $output; } From 1fa9902a688fd3940c1ab6dcf01158136f06e522 Mon Sep 17 00:00:00 2001 From: Quentin Bontemps Date: Tue, 7 Aug 2018 14:14:48 +0200 Subject: [PATCH 13/23] Create folder when isn't exists --- src/LangListService.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/LangListService.php b/src/LangListService.php index 022bbce..5ba5b99 100644 --- a/src/LangListService.php +++ b/src/LangListService.php @@ -106,11 +106,19 @@ private function writeLangFile($locale, $group, $new_translations) $header = " Date: Tue, 8 Jan 2019 15:07:16 +0200 Subject: [PATCH 14/23] L5.7 support --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 7fff3ba..9ac2849 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "license": "MIT", "require": { "php": ">=5.6.4", - "illuminate/support": "5.0.x|5.1.x|5.2.x|5.3.x|5.4.x|5.5.x|5.6.x" + "illuminate/support": "5.0.x|5.1.x|5.2.x|5.3.x|5.4.x|5.5.x|5.6.x|5.7.x" }, "autoload": { "psr-4": { @@ -27,7 +27,7 @@ }, "extra": { "component": "package", - "frameworks": ["Laravel 5.6"], + "frameworks": ["Laravel 5.7"], "laravel": { "providers": [ "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" From a5068ded75a444168d4af1c8be0013cdc5e9d241 Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Fri, 11 Jan 2019 13:19:04 +0100 Subject: [PATCH 15/23] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9ac2849..0425a76 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "license": "MIT", "require": { "php": ">=5.6.4", - "illuminate/support": "5.0.x|5.1.x|5.2.x|5.3.x|5.4.x|5.5.x|5.6.x|5.7.x" + "illuminate/support": "5.x" }, "autoload": { "psr-4": { From 2bf6a554e611bbe1bf599f8252919582b28b7de6 Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Fri, 11 Jan 2019 13:20:24 +0100 Subject: [PATCH 16/23] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 7cebd2e..fb1f3a7 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,9 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ +5.4.5 +* Laravel 5.7 support + 5.4.4 * Laravel 5.6 support From c7d588615f7399b5ae0c62f12350561a8db1c2bc Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Fri, 11 Jan 2019 13:22:06 +0100 Subject: [PATCH 17/23] Update README.md --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fb1f3a7..95d1be9 100644 --- a/README.md +++ b/README.md @@ -110,10 +110,19 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ -5.4.5 +5.4.10 * Laravel 5.7 support -5.4.4 +5.4.9 +* Create new directory, when not exists before + +5.4.8 +* Fix UTF-8 encoding + +5.4.7 +* Handling empty keys + +5.4.6 * Laravel 5.6 support 5.4.3 From 353a22184e0306124ee7f4faa48038707c3e9fea Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Wed, 4 Sep 2019 14:24:45 +0200 Subject: [PATCH 18/23] Laravel 6.0 support --- README.md | 5 ++++- composer.json | 4 ++-- src/LangListService.php | 7 ++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 95d1be9..1834268 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": { - "HighSolutions/laravel-lang-import-export": "5.4.*" + "HighSolutions/laravel-lang-import-export": "^6.0" } ``` @@ -110,6 +110,9 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ +6.0.0 +* Support Laravel 6.0 + 5.4.10 * Laravel 5.7 support diff --git a/composer.json b/composer.json index 0425a76..1533859 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "license": "MIT", "require": { "php": ">=5.6.4", - "illuminate/support": "5.x" + "illuminate/support": "5.*|6.*" }, "autoload": { "psr-4": { @@ -27,7 +27,7 @@ }, "extra": { "component": "package", - "frameworks": ["Laravel 5.7"], + "frameworks": ["Laravel 5.7", "Laravel 5.8", "Laravel 6.0"], "laravel": { "providers": [ "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" diff --git a/src/LangListService.php b/src/LangListService.php index 5ba5b99..4aa94a1 100644 --- a/src/LangListService.php +++ b/src/LangListService.php @@ -4,6 +4,7 @@ use Lang; use File; +use Illuminate\Support\Arr; class LangListService { @@ -55,7 +56,7 @@ private function isOneGroup($group) private function getGroup($locale, $group) { $translations = Lang::getLoader()->load($locale, $group); - return array_dot($translations); + return Array::dot($translations); } /** @@ -134,11 +135,11 @@ private function getTranslations($locale, $group, $new_translations) { $translations = Lang::getLoader()->load($locale, $group); foreach($new_translations as $key => $value) { - array_set($translations, $key, $value); + Array::set($translations, $key, $value); } if(in_array($group, $this->dotFiles)) { - $translations = array_dot($translations); + $translations = Array::dot($translations); } return $translations; From ecdcd3b20cc3c6b30b9c25dbaea200d6c09218a6 Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Wed, 4 Sep 2019 14:57:27 +0200 Subject: [PATCH 19/23] [fix] Array helpers --- src/LangListService.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/LangListService.php b/src/LangListService.php index 4aa94a1..d24a808 100644 --- a/src/LangListService.php +++ b/src/LangListService.php @@ -56,7 +56,7 @@ private function isOneGroup($group) private function getGroup($locale, $group) { $translations = Lang::getLoader()->load($locale, $group); - return Array::dot($translations); + return Arr::dot($translations); } /** @@ -135,11 +135,11 @@ private function getTranslations($locale, $group, $new_translations) { $translations = Lang::getLoader()->load($locale, $group); foreach($new_translations as $key => $value) { - Array::set($translations, $key, $value); + Arr::set($translations, $key, $value); } if(in_array($group, $this->dotFiles)) { - $translations = Array::dot($translations); + $translations = Arr::dot($translations); } return $translations; From 2aa5f6d6da4df21e712844112bc1da468fdf87ba Mon Sep 17 00:00:00 2001 From: HighSolutions Date: Wed, 9 Sep 2020 15:12:46 +0200 Subject: [PATCH 20/23] Support Laravel 8.x --- README.md | 3 +++ composer.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1834268..da04abf 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,9 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ +6.1.0 +* Support Laravel 7.x and 8.x + 6.0.0 * Support Laravel 6.0 diff --git a/composer.json b/composer.json index 1533859..4ddc8cf 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "license": "MIT", "require": { "php": ">=5.6.4", - "illuminate/support": "5.*|6.*" + "illuminate/support": "5.*|^6.0|^7.0|^8.0" }, "autoload": { "psr-4": { @@ -27,7 +27,7 @@ }, "extra": { "component": "package", - "frameworks": ["Laravel 5.7", "Laravel 5.8", "Laravel 6.0"], + "frameworks": ["Laravel 5.7", "Laravel 5.8", "Laravel 6.x", "Laravel 7.x", "Laravel 8.x"], "laravel": { "providers": [ "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" From 4294090357965b5b172315cf2fffb2b4e38c31af Mon Sep 17 00:00:00 2001 From: Adam Matysiak Date: Mon, 15 Jan 2024 16:14:14 +0100 Subject: [PATCH 21/23] Laravel 10.x support --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 4ddc8cf..6a1383d 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "license": "MIT", "require": { "php": ">=5.6.4", - "illuminate/support": "5.*|^6.0|^7.0|^8.0" + "illuminate/support": "5.*|^6.0|^7.0|^8.0|^9.0|^10.0" }, "autoload": { "psr-4": { @@ -27,7 +27,7 @@ }, "extra": { "component": "package", - "frameworks": ["Laravel 5.7", "Laravel 5.8", "Laravel 6.x", "Laravel 7.x", "Laravel 8.x"], + "frameworks": ["Laravel 5.7", "Laravel 5.8", "Laravel 6.x", "Laravel 7.x", "Laravel 8.x", "Laravel 9.x", "Laravel 10.x"], "laravel": { "providers": [ "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" From a56502bc56f296860a91c27018e25c5c68b1c254 Mon Sep 17 00:00:00 2001 From: Adam Matysiak Date: Mon, 15 Jan 2024 16:14:56 +0100 Subject: [PATCH 22/23] Support Laravel 9.x and 10.x --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index da04abf..594a861 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,9 @@ When you call command without parameters - it will try to read default file of e Changelog ------------ +6.2.0 +* Support Laravel 9.x and 10.x + 6.1.0 * Support Laravel 7.x and 8.x From 5c2234a70df7e80be9fe07a15d8a874d210ef599 Mon Sep 17 00:00:00 2001 From: Shift Date: Fri, 1 Mar 2024 17:14:37 +0000 Subject: [PATCH 23/23] Bump dependencies for Laravel 11 --- composer.json | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 6a1383d..3e8abf3 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,15 @@ { "name": "highsolutions/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"], + "keywords": [ + "laravel", + "localization", + "translation", + "messages", + "import", + "export", + "CSV" + ], "authors": [ { "name": "Michael Ruoss", @@ -15,7 +23,7 @@ "license": "MIT", "require": { "php": ">=5.6.4", - "illuminate/support": "5.*|^6.0|^7.0|^8.0|^9.0|^10.0" + "illuminate/support": "5.*|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0" }, "autoload": { "psr-4": { @@ -27,11 +35,19 @@ }, "extra": { "component": "package", - "frameworks": ["Laravel 5.7", "Laravel 5.8", "Laravel 6.x", "Laravel 7.x", "Laravel 8.x", "Laravel 9.x", "Laravel 10.x"], + "frameworks": [ + "Laravel 5.7", + "Laravel 5.8", + "Laravel 6.x", + "Laravel 7.x", + "Laravel 8.x", + "Laravel 9.x", + "Laravel 10.x" + ], "laravel": { "providers": [ "HighSolutions\\LangImportExport\\LangImportExportServiceProvider" - ] + ] } }, "minimum-stability": "stable"