13 public function __construct(
14 private readonly LanguageFallback $languageFallback,
30 $translations = $this->getTranslationsWithFallback( $messageBundle, $languageCode, $skipFallbacks );
31 $normalizedTranslations = [];
32 $prefixToReplace =
'/^' . preg_quote( $messageBundle->
getTitle()->getPrefixedDBkey() .
'/',
'/' ) .
'/';
33 foreach ( $translations as $key => $translation ) {
34 $normalizedTranslations[
35 preg_replace( $prefixToReplace,
'', $key )
39 return $normalizedTranslations;
42 private function getTranslationsWithFallback(
43 MessageBundle $messageBundle,
47 $messageBundleGroup = MessageGroups::getGroup( $messageBundle->getMessageGroupId() );
48 if ( !$messageBundleGroup ) {
49 throw new RuntimeException(
50 "Did not find message group for message bundle: {$messageBundle->getTitle()->getPrefixedText()}"
54 if ( $skipFallbacks ) {
55 $fallbackChain = [ $languageCode ];
59 ...$this->languageFallback->getAll( $languageCode ),
60 $messageBundleGroup->getSourceLanguage()
64 $collection = $messageBundleGroup->initCollection( $fallbackChain[0] );
67 foreach ( $fallbackChain as $fallbackLanguageCode ) {
68 $collection->resetForNewLanguage( $fallbackLanguageCode );
70 $collection->setTags(
'ignored', array_keys( $translations ) );
71 $collection->filter( MessageCollection::FILTER_IGNORED, MessageCollection::EXCLUDE_MATCHING );
72 if ( count( $collection ) === 0 ) {
76 $collection->loadTranslations();
77 $collection->filter( MessageCollection::FILTER_HAS_TRANSLATION, MessageCollection::INCLUDE_MATCHING );
78 foreach ( $collection as $key => $message ) {
79 if ( $message->translation() !==
null ) {
80 $translations[ $key ] = $message->translation();