2declare( strict_types = 1 );
4namespace MediaWiki\Extension\Translate\TranslatorInterface;
11use MediaWiki\Logger\LoggerFactory;
12use MediaWiki\MediaWikiServices;
13use MediaWiki\Revision\RevisionRecord;
14use MediaWiki\User\UserIdentity;
50 if ( $action !==
'edit' ) {
55 if ( !$handle->isValid() ) {
59 if ( $user->isAllowed(
'translate-manage' ) ) {
63 $group = $handle->getGroup();
64 $languages = $group->getTranslatableLanguages();
65 $langCode = $handle->getCode();
66 if ( $languages !==
null && $langCode && !isset( $languages[$langCode] ) ) {
67 $result = [
'translate-language-disabled' ];
71 $groupId = $group->getId();
74 strtok( $groupId,
'-' ),
78 $disabledLanguages = Services::getInstance()->getConfigHelper()->getDisabledTargetLanguages();
79 foreach ( $checks as $check ) {
80 if ( isset( $disabledLanguages[$check][$langCode] ) ) {
81 $reason = $disabledLanguages[$check][$langCode];
82 $result = [
'translate-page-disabled', $reason ];
96 UserIdentity $userIdentity,
99 RevisionRecord $revisionRecord
101 global $wgEnablePageTranslation;
103 $content = $wikiPage->getContent();
105 if ( !$content instanceof TextContent ) {
110 $text = $content->getText();
111 $title = $wikiPage->getTitle();
114 if ( !$handle->isValid() ) {
119 $revId = $revisionRecord->getId();
121 $fuzzy = self::checkNeedsFuzzy( $handle, $text );
122 self::updateFuzzyTag( $title, $revId, $fuzzy );
124 $group = $handle->getGroup();
126 if ( $handle->getCode() !== $group->getSourceLanguage() ) {
131 MessageGroupStats::clear( $handle );
137 DeferredUpdates::addCallableUpdate(
138 static function () use ( $handle ) {
142 $mwServices = MediaWikiServices::getInstance();
143 $user = $mwServices->getUserFactory()
144 ->newFromId( $userIdentity->getId() );
147 $mwServices->getHookContainer()
148 ->run(
'Translate:newTranslation', [ $handle, $revId, $text, $user ] );
151 TTMServer::onChange( $handle );
153 if ( $wgEnablePageTranslation && $handle->isPageTranslation() ) {
155 $minor = $flags & EDIT_MINOR;
157 $summary, $minor, $flags, $handle );
162 private static function checkNeedsFuzzy(
MessageHandle $handle,
string $text ): bool {
164 if ( $handle->isDoc() ) {
169 if ( MessageHandle::hasFuzzyString( $text ) ) {
174 $group = $handle->getGroup();
175 $validator = $group->getValidator();
182 $code = $handle->getCode();
183 $key = $handle->getKey();
184 $en = $group->getMessage( $key, $group->getSourceLanguage() );
187 $message->setTranslation( $text );
188 if ( $message->definition() ===
null ) {
191 LoggerFactory::getInstance(
'Translate' )->warning(
192 'Message definition is empty! Title: {title}, group: {group}, key: {key}',
194 'title' => $handle->getTitle()->getPrefixedText(),
195 'group' => $group->getId(),
202 $validationResult = $validator->quickValidate( $message, $code );
203 return $validationResult->hasIssues();
211 private static function updateFuzzyTag( Title $title,
int $revision,
bool $fuzzy ): void {
212 $dbw = MediaWikiServices::getInstance()->getDBLoadBalancer()->getConnection( DB_PRIMARY );
215 'rt_page' => $title->getArticleID(),
216 'rt_type' => RevTagStore::FUZZY_TAG,
217 'rt_revision' => $revision
222 $index = array_keys( $conds );
223 $dbw->replace(
'revtag', [ $index ], $conds, __METHOD__ );
225 $dbw->delete(
'revtag', $conds, __METHOD__ );
241 if ( $user->isAllowed(
'bot' ) ) {
245 $group = $handle->getGroup();
247 $title = $handle->getTitle();
248 $name = $handle->getKey() .
'/' . $group->getSourceLanguage();
249 $definitionTitle = Title::makeTitleSafe( $title->getNamespace(), $name );
250 if ( !$definitionTitle || !$definitionTitle->exists() ) {
254 $definitionRevision = $definitionTitle->getLatestRevID();
255 $dbw = MediaWikiServices::getInstance()
256 ->getDBLoadBalancer()
257 ->getConnection( DB_PRIMARY );
260 'rt_page' => $title->getArticleID(),
261 'rt_type' => RevTagStore::TRANSVER_PROP,
262 'rt_revision' => $revision,
263 'rt_value' => $definitionRevision,
265 $index = [
'rt_type',
'rt_page',
'rt_revision' ];
266 $dbw->replace(
'revtag', [ $index ], $conds, __METHOD__ );
276 global $wgTranslateUsePreSaveTransform;
278 if ( !$wgTranslateUsePreSaveTransform ) {
280 if ( $handle->isMessageNamespace() && !$handle->isDoc() ) {
281 $popts->setPreSaveTransform(
false );
Message object where you can directly set the translation.
Hooks for page translation.
static onSectionSave(WikiPage $wikiPage, User $user, TextContent $content, $summary, $minor, $flags, MessageHandle $handle)
This is triggered after an edit to translation unit page.
Logic for handling automatic message group state changes.
static onChange(MessageHandle $handle)
Hook: TranslateEventTranslationReview and also on translation changes.
This class abstract MessageGroup statistics calculation and storing.
Class for pointing to messages, like Title class is for titles.
Some general static methods for instantiating TTMServer and helpers.