public static function generate($language = false) { $config = config('db-translator'); /** * First we get the list of languages and iterate for each one of them * to get the associated translations */ if ($language) { if (is_integer($language)) { $languages[] = Languages::find($language); } else { $languages = Languages::whereIso($language)->get(); } } else { $languages = Languages::whereStatus(1)->get(); } /** * Get the list of available variables in the database */ $variables = Intl::all(); $arr = []; foreach ($languages as $language) { /** * Lets generate a list of variables per language and * all translations associated */ foreach ($variables as $variable) { /** * Generate per group */ $trans = Translated::VarLang($variable->id, $language->id)->first()['translation']; $translation = $trans ? $trans : $variable->text; $arr[$language->iso][$variable->group][] = [md5($variable->text) . sha1($variable->text) => $translation]; } } foreach ($arr as $language => $values) { \File::deleteDirectory(base_path('resources/lang/vendor/dbtranslator/' . $language), true); foreach ($values as $group => $trans) { $file = "<?php\nreturn [\r\n"; foreach ($trans as $hash => $translated) { $save_value = str_replace('"', '\\"', array_values($translated)[0]); $file .= " \"" . array_keys($translated)[0] . "\" => \"" . $save_value . "\",\r\n"; } $file .= "];"; \Storage::disk($config['storage_driver'])->put($language . '/' . $group . '.php', $file); } } return true; }
/** * If using the return method, it will return an array of the variable */ function lang($text = false, $vars = null, $value = null, $group = null, $locale = null, $force_add = false) { $original_locale = Lang::getLocale(); $params['value'] = $value ? $value : 0; $params['vars'] = $vars ? $vars : []; $params['locale'] = $locale ? $locale : $original_locale; $params['group'] = $group ? $group : 'general'; $params['dynamic'] = false; if (preg_match('/dynamic_/', $params['group'])) { $params['group'] = preg_replace('/dynamic_/', '', $params['group']); $params['dynamic'] = true; } $hash = md5($text) . sha1($text); $file_namespace = 'dbtranslator'; if (preg_match('/\\|/', $text)) { $choose = true; } else { $choose = false; } $config = config('db-translator'); /** * Before anything lets change the locale to the intl locale */ App::setLocale($params['locale']); /** * This will check the existence of the translation on the locale given, not the default */ if (!$force_add) { if (Lang::has($file_namespace . '::' . $params['group'] . '.' . $hash)) { if ($choose) { $text = trans_choice($file_namespace . '::' . $params['group'] . '.' . $hash, $params['value'], $params['vars']); App::setLocale($original_locale); return $text; } else { $text = trans($file_namespace . '::' . $params['group'] . '.' . $hash, $params['vars']); App::setLocale($original_locale); return $text; } } else { /** * If we are using the database translations */ if ($config['use_database']) { if (!Intl::whereText($text)->whereGroup($params['group'])->get()->count()) { $intl = new Intl(); $intl->text = $text; $intl->group = $params['group']; $intl->md5sha1 = $hash; $intl->dynamic = $params['dynamic']; $intl->save(); } } else { /** * first we will check if the translation exists under the fallback language */ App::setLocale($config['default_locale']); if (!Lang::has($file_namespace . '::' . $params['group'] . '.' . $hash)) { // if we don't find it, we should include the file for the original locale // change it with the new array, and save it. /** * Determine if the file exists */ if (Storage::disk($config['storage_driver'])->exists($config['default_locale'] . '/' . $params['group'] . '.php')) { $lang_array = (require base_path('resources/lang/vendor/dbtranslator/' . $config['default_locale'] . '/' . $params['group'] . '.php')); if (!isset($lang_array[$hash])) { $lang_array[$hash] = $text; $file = "<?php\n return [\r\n"; foreach ($lang_array as $k => $v) { $file .= " \"" . $k . "\" => \"" . str_replace('"', '\\"', $v) . "\",\r\n"; } $file .= "];"; Storage::disk($config['storage_driver'])->put($config['default_locale'] . '/' . $params['group'] . '.php', $file); } } else { $file = "<?php\n return [\r\n"; $file .= " \"" . $hash . "\" => \"" . str_replace('"', '\\"', $text) . "\",\r\n"; $file .= "];"; Storage::disk($config['storage_driver'])->put($config['default_locale'] . '/' . $params['group'] . '.php', $file); } } App::setLocale($params['locale']); } // now we will process the string if ($choose) { $params['vars']['count'] = $params['value']; $ms = new MessageSelector(); $text = $ms->choose($text, $params['value'], $params['locale']); $params['vars'] = (new Collection($params['vars']))->sortBy(function ($value, $key) { return mb_strlen($key) * -1; }); foreach ($params['vars'] as $key => $value) { $text = str_replace(':' . $key, $value, $text); } App::setLocale($original_locale); return $text; } else { if (count($params['vars'])) { $params['vars'] = (new Collection($params['vars']))->sortBy(function ($value, $key) { return mb_strlen($key) * -1; }); foreach ($params['vars'] as $key => $value) { $text = str_replace(':' . $key, $value, $text); } } App::setLocale($original_locale); return $text; } } } else { if ($config['use_database']) { if (!Intl::whereText($text)->whereGroup($params['group'])->get()->count()) { $intl = new Intl(); $intl->text = $text; $intl->group = $params['group']; $intl->md5sha1 = $hash; $intl->dynamic = $params['dynamic']; $intl->save(); } } } }
/** * Execute the command. * * @return void */ public function handle() { $variables = Intl::whereDynamic(0)->get()->toArray(); /** * Get all files in views */ $paths = []; $folders = config('view'); $paths[] = base_path('app/Http'); foreach ($folders['paths'] as $folder) { $paths[] = $folder; } $keys = []; $bar_path = $this->output->createProgressBar(count($paths)); foreach ($paths as $key => $path) { //$this->info('PATH: "'.$path); $finder = new Finder(); $bar_finder = $this->output->createProgressBar(count($finder->in($path)->name('*.php')->files())); foreach ($finder as $file) { $f = $file->getContents(); preg_match_all("/lang(?:\\s*)\\((?:(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\"))(?:(?:\\s*)(?:\\,(?:\\s*)((?:\\[|array\\().*(?:\\]|\\))|null)(?:\\s*)(?:\\,(?:\\s*)(?:(\\d+?|null))(?:\\s*)(?:\\,(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\")(?:\\s*)?)?)?)?)\\)/", $f, $matches); if (count($matches[2]) > 0) { foreach ($matches[2] as $k) { while (preg_match_all("/lang(?:\\s*)\\((?:(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\"))(?:(?:\\s*)(?:\\,(?:\\s*)((?:\\[|array\\().*(?:\\]|\\))|null)(?:\\s*)(?:\\,(?:\\s*)(?:(\\d+?|null))(?:\\s*)(?:\\,(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\")(?:\\s*)?)?)?)?)\\)/", $k, $ka)) { $keys[] = $ka[0][0]; $k = str_replace($ka[0][0], "null", $k); $f = str_replace($ka[0][0], "null", $f); } while (preg_match_all("/lang(?:\\s*)\\((?:(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\"))(?:(?:\\s*)(?:\\,(?:\\s*)((?:\\[|array\\().*(?:\\]|\\))|null)(?:\\s*)(?:\\,(?:\\s*)(?:(\\d+?|null))(?:\\s*)(?:\\,(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\")(?:\\s*)?)?)?)?)\\)/", $f, $kv)) { foreach ($kv[0] as $fa) { $keys[] = $fa; $f = str_replace($fa, "null", $f); } } } } $bar_finder->advance(); } $bar_path->advance(); } $bar_finder->finish(); $bar_path->finish(); $keys = array_unique($keys); $check = []; $bar = $this->output->createProgressBar(count($keys)); foreach ($keys as $key => $match) { if (!preg_match("/(lang(?:(\\s?|\\s+))\\()(?:(\\s?|\\s+))(?:(\\\$))/", $match)) { // if it is not a dynamic variable preg_match_all("/lang(?:\\s*)\\((?:(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\"))(?:(?:\\s*)(?:\\,(?:\\s*)((?:\\[|array\\().*(?:\\]|\\))|null)(?:\\s*)(?:\\,(?:\\s*)(?:(\\d+?|null))(?:\\s*)(?:\\,(?:\\s*)(?:\\'|\\\")(.*?)(?:\\'|\\\")(?:\\s*)?)?)?)?)\\)/", $match, $d); if (!empty($d[1][0]) and (!empty($d[4][0]) and $d[4][0] != 'null')) { $check[$d[4][0]][] = $d[1][0]; //$this->info('INSERTING: "'.$d[1][0].'" on "'.$d[4][0].'" group.'); } elseif (!empty($d[1][0])) { $check['general'][] = $d[1][0]; //$this->info('INSERTING: "'.$d[1][0].'" on "general" group.'); } } $bar->advance(); } $bar->finish(); /** * lets iterate though all variables in the database and see which ones need to be removed */ $toremove = false; if (count($variables) > 0) { foreach ($variables as $key => $variable) { if (!isset($check[$variable['group']])) { $toremove = true; $remove[] = $variable['id']; $this->info('TO REMOVE: "' . $variable['group'] . ':' . $variable['md5sha1'] . '.' . $variable['text'] . '"'); } else { if (!in_array($variable['text'], array_values($check[$variable['group']]))) { $toremove = true; $remove[] = $variable['id']; $this->info('TO REMOVE: "' . $variable['group'] . ':' . $variable['md5sha1'] . '.' . $variable['text'] . '"'); } } } } if ($toremove) { if ($this->confirm('Do you wish to continue removing this from database? [yes|no]')) { foreach ($remove as $key => $id) { $locale = Intl::find($id); $locale->delete(); $this->info('REMOVING: ' . $id); } } $this->info('Completed!'); } else { $this->info('Nothing to remove!'); } }