• Модуль: translate
  • Путь к файлу: ~/bitrix/modules/translate/lib/file.php
  • Класс: BitrixTranslateFile
  • Вызов: File::updatePhraseIndex
public function updatePhraseIndex(): IndexFileIndex
{
	$this->getFileIndex();
	$fileId = $this->fileIndex->getId();
	if ($fileId > 0)
	{
		$phraseId = IndexInternalsPhraseIndexTable::query()
			->registerRuntimeField(new MainORMFieldsExpressionField('MAXID', 'MAX(%s)', ['ID']))
			->addSelect('MAXID')
			->exec()
			->fetch()['MAXID'];

		$pathId = $this->fileIndex->getPathId();
		$phraseData = [];
		$phraseCodeData = [];
		foreach ($this as $code => $phrase)
		{
			$phraseId ++;
			$langId = $this->getLangId();
			$phraseCodeData[] = [
				'ID' => $phraseId,
				'FILE_ID' => $fileId,
				'PATH_ID' => $pathId,
				'LANG_ID' => $langId,
				'CODE' => $code,
			];

			if (!isset($phraseData[$langId]))
			{
				$phraseData[$langId] = [];
			}
			$phraseData[$langId][] = [
				'ID' => $phraseId,
				'FILE_ID' => $fileId,
				'PATH_ID' => $pathId,
				'CODE' => $code,
				'PHRASE' => $phrase,
			];
		}

		// delete
		$filter = new TranslateFilter(['fileId' => $fileId]);

		IndexInternalsPhraseIndexTable::purge($filter);

		foreach (TranslateConfig::getLanguages() as $langId)
		{
			$ftsClass = IndexInternalsPhraseFts::getFtsEntityClass($langId);
			$ftsClass::purge($filter);
		}

		// add
		if (count($phraseCodeData) > 0)
		{
			IndexInternalsPhraseIndexTable::bulkAdd($phraseCodeData);
			foreach ($phraseData as $langId => $phraseLangData)
			{
				$ftsClass = IndexInternalsPhraseFts::getFtsEntityClass($langId);
				$ftsClass::bulkAdd($phraseLangData, 'ID');
			}
		}

		$this->fileIndex
			->setPhraseCount($this->count())
			->setIndexed(true)
			->setIndexedTime(new MainTypeDateTime())
			->save();
	}

	return $this->fileIndex;
}