192 lines
5.4 KiB
PHP
192 lines
5.4 KiB
PHP
|
|
<?php namespace RainLab\Translate\Classes;
|
||
|
|
|
||
|
|
use Cms\Classes\Page;
|
||
|
|
use Cms\Classes\Theme;
|
||
|
|
use Cms\Classes\Layout;
|
||
|
|
use Cms\Classes\Partial;
|
||
|
|
use RainLab\Translate\Models\Message;
|
||
|
|
use RainLab\Translate\Classes\Translator;
|
||
|
|
use System\Models\MailTemplate;
|
||
|
|
use Event;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Theme scanner class
|
||
|
|
*
|
||
|
|
* @package rainlab\translate
|
||
|
|
* @author Alexey Bobkov, Samuel Georges
|
||
|
|
*/
|
||
|
|
class ThemeScanner
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* Helper method for scanForMessages()
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
public static function scan()
|
||
|
|
{
|
||
|
|
$obj = new static;
|
||
|
|
|
||
|
|
$obj->scanForMessages();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @event rainlab.translate.themeScanner.afterScan
|
||
|
|
* Fires after theme scanning.
|
||
|
|
*
|
||
|
|
* Example usage:
|
||
|
|
*
|
||
|
|
* Event::listen('rainlab.translate.themeScanner.afterScan', function (ThemeScanner $scanner) {
|
||
|
|
* // added an extra scan. Add generation files...
|
||
|
|
* });
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
Event::fire('rainlab.translate.themeScanner.afterScan', [$obj]);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Scans theme templates and config for messages.
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
public function scanForMessages()
|
||
|
|
{
|
||
|
|
// Set all messages initially as being not found. The scanner later
|
||
|
|
// sets the entries it finds as found.
|
||
|
|
Message::query()->update(['found' => false]);
|
||
|
|
|
||
|
|
$this->scanThemeConfigForMessages();
|
||
|
|
$this->scanThemeTemplatesForMessages();
|
||
|
|
$this->scanMailTemplatesForMessages();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Scans the theme configuration for defined messages
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
public function scanThemeConfigForMessages()
|
||
|
|
{
|
||
|
|
$theme = Theme::getActiveTheme();
|
||
|
|
$config = $theme->getConfigArray('translate');
|
||
|
|
|
||
|
|
if (!count($config)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
$translator = Translator::instance();
|
||
|
|
$keys = [];
|
||
|
|
|
||
|
|
foreach ($config as $locale => $messages) {
|
||
|
|
if (is_string($messages)) {
|
||
|
|
// $message is a yaml filename, load the yaml file
|
||
|
|
$messages = $theme->getConfigArray('translate.'.$locale);
|
||
|
|
}
|
||
|
|
$keys = array_merge($keys, array_keys($messages));
|
||
|
|
}
|
||
|
|
|
||
|
|
Message::importMessages($keys);
|
||
|
|
|
||
|
|
foreach ($config as $locale => $messages) {
|
||
|
|
if (is_string($messages)) {
|
||
|
|
// $message is a yaml filename, load the yaml file
|
||
|
|
$messages = $theme->getConfigArray('translate.'.$locale);
|
||
|
|
}
|
||
|
|
Message::importMessageCodes($messages, $locale);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Scans the theme templates for message references.
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
public function scanThemeTemplatesForMessages()
|
||
|
|
{
|
||
|
|
$messages = [];
|
||
|
|
|
||
|
|
foreach (Layout::all() as $layout) {
|
||
|
|
$messages = array_merge($messages, $this->parseContent($layout->markup));
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (Page::all() as $page) {
|
||
|
|
$messages = array_merge($messages, $this->parseContent($page->markup));
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (Partial::all() as $partial) {
|
||
|
|
$messages = array_merge($messages, $this->parseContent($partial->markup));
|
||
|
|
}
|
||
|
|
|
||
|
|
Message::importMessages($messages);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Scans the mail templates for message references.
|
||
|
|
* @return void
|
||
|
|
*/
|
||
|
|
public function scanMailTemplatesForMessages()
|
||
|
|
{
|
||
|
|
$messages = [];
|
||
|
|
|
||
|
|
foreach (MailTemplate::allTemplates() as $mailTemplate) {
|
||
|
|
$messages = array_merge($messages, $this->parseContent($mailTemplate->subject));
|
||
|
|
$messages = array_merge($messages, $this->parseContent($mailTemplate->content_html));
|
||
|
|
}
|
||
|
|
|
||
|
|
Message::importMessages($messages);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Parse the known language tag types in to messages.
|
||
|
|
* @param string $content
|
||
|
|
* @return array
|
||
|
|
*/
|
||
|
|
protected function parseContent($content)
|
||
|
|
{
|
||
|
|
$messages = [];
|
||
|
|
$messages = array_merge($messages, $this->processStandardTags($content));
|
||
|
|
|
||
|
|
return $messages;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Process standard language filter tag (_|)
|
||
|
|
* @param string $content
|
||
|
|
* @return array
|
||
|
|
*/
|
||
|
|
protected function processStandardTags($content)
|
||
|
|
{
|
||
|
|
$messages = [];
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Regex used:
|
||
|
|
*
|
||
|
|
* {{'AJAX framework'|_}}
|
||
|
|
* {{\s*'([^'])+'\s*[|]\s*_\s*}}
|
||
|
|
*
|
||
|
|
* {{'AJAX framework'|_(variables)}}
|
||
|
|
* {{\s*'([^'])+'\s*[|]\s*_\s*\([^\)]+\)\s*}}
|
||
|
|
*/
|
||
|
|
|
||
|
|
$quoteChar = preg_quote("'");
|
||
|
|
|
||
|
|
preg_match_all('#{{\s*'.$quoteChar.'([^'.$quoteChar.']+)'.$quoteChar.'\s*[|]\s*_\s*(?:[|].+)?}}#', $content, $match);
|
||
|
|
if (isset($match[1])) {
|
||
|
|
$messages = array_merge($messages, $match[1]);
|
||
|
|
}
|
||
|
|
|
||
|
|
preg_match_all('#{{\s*'.$quoteChar.'([^'.$quoteChar.']+)'.$quoteChar.'\s*[|]\s*_\s*\([^\)]+\)\s*}}#', $content, $match);
|
||
|
|
if (isset($match[1])) {
|
||
|
|
$messages = array_merge($messages, $match[1]);
|
||
|
|
}
|
||
|
|
|
||
|
|
$quoteChar = preg_quote('"');
|
||
|
|
|
||
|
|
preg_match_all('#{{\s*'.$quoteChar.'([^'.$quoteChar.']+)'.$quoteChar.'\s*[|]\s*_\s*(?:[|].+)?}}#', $content, $match);
|
||
|
|
if (isset($match[1])) {
|
||
|
|
$messages = array_merge($messages, $match[1]);
|
||
|
|
}
|
||
|
|
|
||
|
|
preg_match_all('#{{\s*'.$quoteChar.'([^'.$quoteChar.']+)'.$quoteChar.'\s*[|]\s*_\s*\([^\)]+\)\s*}}#', $content, $match);
|
||
|
|
if (isset($match[1])) {
|
||
|
|
$messages = array_merge($messages, $match[1]);
|
||
|
|
}
|
||
|
|
|
||
|
|
return $messages;
|
||
|
|
}
|
||
|
|
}
|