• Модуль: translate
  • Путь к файлу: ~/bitrix/modules/translate/lib/controller/editor/savesource.php
  • Класс: BitrixTranslateControllerEditorSaveSource
  • Вызов: SaveSource::run
public function run($file = '')
{
	Loc::loadLanguageFile(__DIR__. '/operation.php');
	Loc::loadLanguageFile(__FILE__);

	$result = [];
	if (empty($file))
	{
		$this->addError(new MainError(Loc::getMessage('TR_EDIT_FILE_PATH_ERROR')));
		return $result;
	}
	$normalized = MainIOPath::normalize($file);
	if ($normalized != $file)
	{
		$this->addError(new MainError(Loc::getMessage('TR_EDIT_FILE_WRONG_NAME')));
		return $result;
	}
	$file = $normalized;
	if (!TranslateIOPath::isLangDir($file, true) || !TranslateIOPath::isPhpFile($file))
	{
		$this->addError(new MainError(Loc::getMessage('TR_EDIT_ERROR_FILE_NOT_LANG', ['#FILE#' => $file])));
		return $result;
	}
	if (!TranslatePermission::isAllowPath($file))
	{
		$this->addError(new MainError(Loc::getMessage('TR_EDIT_FILE_WRONG_NAME')));
		return $result;
	}

	$request = $this->controller->getRequest();

	$languagesToUpdate = [];

	$enabledLanguagesList = TranslateConfig::getEnabledLanguages();

	// languages to update
	$languagesToUpdateTmp = $request->getPost('LANGS');
	if ($languagesToUpdateTmp !== null && is_array($languagesToUpdateTmp) && count($languagesToUpdateTmp) > 0)
	{
		$languagesToUpdate = array_intersect($languagesToUpdateTmp, $enabledLanguagesList);
	}
	unset($languagesToUpdateTmp);

	$currentEncoding = MainLocalizationTranslation::getCurrentEncoding();
	$documentRoot = rtrim(TranslateIOPath::tidy(MainApplication::getDocumentRoot()), '/');

	foreach ($enabledLanguagesList as $langId)
	{
		if (!in_array($langId, $languagesToUpdate))
		{
			continue;
		}

		$langRelPath = TranslateIOPath::replaceLangId($file, $langId);
		$fullPath = TranslateIOPath::tidy($documentRoot.'/'.$langRelPath);
		$fullPath = MainLocalizationTranslation::convertLangPath($fullPath, $langId);

		$langFile = new TranslateFile($fullPath);
		$langFile
			->setLangId($langId)
			->setOperatingEncoding($currentEncoding);

		// backup
		if ($langFile->isExists() && TranslateConfig::needToBackUpFiles())
		{
			if (!$langFile->backup())
			{
				$this->addError(new MainError(
					Loc::getMessage('TR_CREATE_BACKUP_ERROR', ['#FILE#' => $langFile->getPath()])
				));
			}
		}

		$fileSrcForSave = $request->getPost('SRC_'. $langId);

		if (empty($fileSrcForSave) || !is_string($fileSrcForSave))
		{
			$this->addError(new MainError(Loc::getMessage('TR_EDIT_PARAM_ERROR')));
			continue;
		}

		if (!$langFile->lint($fileSrcForSave))
		{
			$this->addErrors($langFile->getErrors());
			continue;
		}

		try
		{
			if (!$langFile->putContents($fileSrcForSave))
			{
				if ($langFile->hasErrors())
				{
					$this->addErrors($langFile->getErrors());
				}
			}
			else
			{
				// check
				if (!$langFile->load() && $langFile->hasErrors())
				{
					$this->addErrors($langFile->getErrors());
				}
				elseif ($langFile->count() > 0)
				{
					$langFile->updatePhraseIndex();
				}
			}
		}
		catch (MainIOIoException $exception)
		{
			if (!$langFile->isExists())
			{
				$this->addError(new MainError(
					Loc::getMessage('TR_ERROR_WRITE_CREATE', ['#FILE#' => $langFile->getPath()])
				));
			}
			else
			{
				$this->addError(new MainError(
					Loc::getMessage('TR_ERROR_WRITE_UPDATE', ['#FILE#' => $langFile->getPath()])
				));
			}
		}
	}

	if (!$this->hasErrors())
	{
		$result['SUMMARY'] = Loc::getMessage('TR_EDIT_SAVING_COMPLETED');
	}

	return $result;
}