. * */ namespace Vvveb\Controller\Localization; use function Vvveb\__; use Vvveb\Controller\Base; use function Vvveb\url; require_once DIR_SYSTEM . 'functions' . DS . 'php-mo.php'; class Translations extends Base { function domains() { $lang = $this->request->get['lang'] ?? false; if ($lang) { $folder = DIR_ROOT . 'locale' . DS . $lang . DS . 'LC_MESSAGES' . DS; $files = glob($folder . '*.po'); $url = ['module' => 'localization/translations', 'action' => 'domain', 'lang' => $lang]; //add user if does not exist yet $domains['user'] = url($url + ['domain' => 'user']); foreach ($files as $file) { $domain = str_replace('.po', '', basename($file)); $domains[$domain] = url($url + ['domain' => $domain]); } $this->view->domains = $domains; $this->view->count = count($domains); } else { $this->notFound(__('Invalid request!')); } } private function compile() { //add default translations first to be overriden by all others $domains = ['vvveb']; $message = ''; $view = $this->view; $folder = DIR_ROOT . 'locale' . DS . $view->lang . DS . 'LC_MESSAGES' . DS; foreach (glob("$folder/*.po") as $file) { $domain = str_replace('.po', '', basename($file)); if ($domain !== 'user' && $domain !== 'vvveb') { $domains[] = $domain; } } //add user translations last to override all others $domains[] = 'user'; foreach ($domains as $domain) { $poFile = $folder . $domain . '.po'; if (file_exists($poFile) && ($translations = phpmo_parse_po_file($poFile) ?: []) && is_array($translations)) { $view->translations = array_merge($view->translations, $translations); } } //compile if (phpmo_write_mo_file($view->translations, $folder . 'vvveb-new.mo')) { if (rename($folder . 'vvveb-new.mo', $folder . 'vvveb.mo')) { clearstatcache(); $message .= "\n" . __('Compiled!'); } } else { $message .= "\n" . __('Error compiling!'); } return $message; } function save() { $view = $this->view; $translations = $this->request->post['translations'] ?? []; $this->response->setType('json'); $message = __('No data!'); if ($translations) { //use common check po file and parse $this->domain(); $folder = DIR_ROOT . 'locale' . DS . $view->lang . DS . 'LC_MESSAGES' . DS; foreach ($translations as $text => $translation) { $view->translations[$text] = ['msgid' => $text, 'msgstr' => [$translation]]; } if (phpmo_write_po_file($view->translations, $folder . $view->domain . '.po')) { $message = __('Saved!'); $message .= $this->compile(); } else { $message = __('Error saving!'); } } $result = ['message' => $message]; $this->response->output($result); } function domain() { $view = $this->view; $view->lang = $lang = $this->request->get['lang'] ?? false; $view->domain = $domain = $this->request->get['domain'] ?? false; $url = ['module' => 'localization/translations', 'lang' => $lang, 'domain' => $domain]; $view->domainsUrl = url($url + ['action' => 'domains']); $view->saveUrl = url($url + ['action' => 'save']); if ($lang && $domain) { $poFile = DIR_ROOT . 'locale' . DS . $lang . DS . 'LC_MESSAGES' . DS . $domain . '.po'; $view->poFile = $poFile; if (file_exists($poFile)) { $view->translations = phpmo_parse_po_file($poFile); if (! is_writeable($poFile)) { $view->info = [__('Po file not writable, saving will not work!')]; } } else { if ($domain == 'user') { //if domain is user then create it $view->translations = []; } else { $this->notFound(__('Po file does not exist!')); } } } else { $this->notFound(__('Invalid request!')); } } }