definition(); $translation = $message->translation(); $definitionHasPlural = UnicodePlural::hasPlural( $definition ); $translationHasPlural = UnicodePlural::hasPlural( $translation ); $presence = $this->pluralPresenceCheck( $definitionHasPlural, $translationHasPlural ); // Using same check keys as MediaWikiPluralValidator if ( $presence === 'missing' ) { $issue = new ValidationIssue( 'plural', 'missing', 'translate-checks-unicode-plural-missing' ); $issues->add( $issue ); } elseif ( $presence === 'unsupported' ) { $issue = new ValidationIssue( 'plural', 'unsupported', 'translate-checks-unicode-plural-unsupported' ); $issues->add( $issue ); } elseif ( $presence === 'ok' ) { [ $msgcode, $actualKeywords ] = $this->pluralFormCheck( $translation, $expectedKeywords ); if ( $msgcode === 'invalid' ) { $expectedExample = UnicodePlural::flattenList( array_map( [ $this, 'createFormExample' ], $expectedKeywords ) ); $actualExample = UnicodePlural::flattenList( array_map( [ $this, 'createFormExample' ], $actualKeywords ) ); $issue = new ValidationIssue( 'plural', 'forms', 'translate-checks-unicode-plural-invalid', [ [ 'PLAIN', $expectedExample ], [ 'PLAIN', $actualExample ], ] ); $issues->add( $issue ); } } // else: not-applicable return $issues; } private function createFormExample( string $keyword ): array { return [ $keyword, '…' ]; } private function pluralPresenceCheck( bool $definitionHasPlural, bool $translationHasPlural ): string { if ( !$definitionHasPlural && $translationHasPlural ) { return 'unsupported'; } elseif ( $definitionHasPlural && !$translationHasPlural ) { return 'missing'; } elseif ( !$definitionHasPlural && !$translationHasPlural ) { return 'not-applicable'; } // Both have plural return 'ok'; } private function pluralFormCheck( string $text, array $expectedKeywords ): array { [ , $instanceMap ] = UnicodePlural::parsePluralForms( $text ); foreach ( $instanceMap as $forms ) { $actualKeywords = []; foreach ( $forms as [ $keyword, ] ) { $actualKeywords[] = $keyword; } if ( $actualKeywords !== $expectedKeywords ) { return [ 'invalid', $actualKeywords ]; } } return [ 'ok', [] ]; } } class_alias( UnicodePluralValidator::class, '\MediaWiki\Extensions\Translate\UnicodePluralValidator' );