Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
MessageBundleTranslationLoader.php
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\MessageBundleTranslation;
5
7use MediaWiki\Languages\LanguageFallback;
8use RuntimeException;
9
11 private LanguageFallback $languageFallback;
12
13 public function __construct( LanguageFallback $languageFallback ) {
14 $this->languageFallback = $languageFallback;
15 }
16
24 public function get(
25 MessageBundle $messageBundle,
26 string $languageCode,
27 bool $skipFallbacks
28 ): array {
29 $translations = $this->getTranslationsWithFallback( $messageBundle, $languageCode, $skipFallbacks );
30 $normalizedTranslations = [];
31 foreach ( $translations as $key => $translation ) {
32 $normalizedTranslations[
33 str_replace( "{$messageBundle->getTitle()->getDBkey()}/", '', $key )
34 ] = $translation;
35 }
36
37 return $normalizedTranslations;
38 }
39
40 private function getTranslationsWithFallback(
41 MessageBundle $messageBundle,
42 string $languageCode,
43 bool $skipFallbacks
44 ): array {
45 $messageBundleGroup = MessageGroups::getGroup( $messageBundle->getMessageGroupId() );
46 if ( !$messageBundleGroup ) {
47 throw new RuntimeException(
48 "Did not find message group for message bundle: {$messageBundle->getTitle()->getPrefixedText()}"
49 );
50 }
51
52 if ( $skipFallbacks ) {
53 $fallbackChain = [ $languageCode ];
54 } else {
55 $fallbackChain = [
56 $languageCode,
57 ...$this->languageFallback->getAll( $languageCode ),
58 $messageBundleGroup->getSourceLanguage()
59 ];
60 }
61
62 $collection = $messageBundleGroup->initCollection( $fallbackChain[0] );
63 $translations = [];
64
65 foreach ( $fallbackChain as $fallbackLanguageCode ) {
66 $collection->resetForNewLanguage( $fallbackLanguageCode );
67 // TODO use custom tag after fixing MessageCollection::filter
68 $collection->setTags( 'ignored', array_keys( $translations ) );
69 $collection->filter( 'ignored' );
70 if ( count( $collection ) === 0 ) {
71 break;
72 }
73
74 $collection->loadTranslations();
75 $collection->filter( 'hastranslation', false );
76 foreach ( $collection as $key => $message ) {
77 if ( $message->translation() !== null ) {
78 $translations[ $key ] = $message->translation();
79 }
80 }
81 }
82
83 return $translations;
84 }
85}
Factory class for accessing message groups individually by id or all of them as a list.