Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
LanguageConverterIcu
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 5
110
0.00% covered (danger)
0.00%
0 / 1
 loadDefaultTables
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 translate
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 icuTranslate
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getIcuRules
n/a
0 / 0
n/a
0 / 0
0
 getTransliterators
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
20
 getTransliteratorAliases
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * @license GPL-2.0-or-later
4 * @file
5 */
6
7namespace MediaWiki\Language;
8
9use Transliterator;
10use Wikimedia\ReplacementArray;
11
12/**
13 * A class that extends LanguageConverterSpecific for converts that use
14 * ICU rule-based transliterators.
15 *
16 * @ingroup Language
17 */
18abstract class LanguageConverterIcu extends LanguageConverterSpecific {
19
20    /**
21     * @var Transliterator[]
22     */
23    protected $mTransliterators;
24
25    /**
26     * Creates empty tables. mTransliterators will be used instead.
27     */
28    protected function loadDefaultTables(): array {
29        $tables = [];
30        foreach ( $this->getVariants() as $variant ) {
31            $tables[$variant] = new ReplacementArray();
32        }
33        return $tables;
34    }
35
36    /** @inheritDoc */
37    public function translate( $text, $variant ) {
38        $text = parent::translate( $text, $variant );
39        if ( trim( $text ) ) {
40            $text = $this->icuTranslate( $text, $variant );
41        }
42        return $text;
43    }
44
45    /**
46     * Translate a string to a variant using ICU transliterator.
47     *
48     * @param string $text Text to convert
49     * @param string $variant Variant language code
50     * @return string Translated text
51     */
52    public function icuTranslate( $text, $variant ) {
53        return $this->getTransliterators()[$variant]->transliterate( $text );
54    }
55
56    /**
57     * Get the array mapping variants to ICU transliteration rules.
58     * Subclasses must implement this.
59     *
60     * @return string[]
61     */
62    abstract protected function getIcuRules();
63
64    /**
65     * Get the array mapping variants to ICU transliterators.
66     *
67     * @return Transliterator[]
68     */
69    protected function getTransliterators() {
70        if ( $this->mTransliterators === null ) {
71            $this->mTransliterators = [];
72            foreach ( $this->getIcuRules() as $variant => $rule ) {
73                // @phan-suppress-next-line PhanTypeMismatchProperty Assume it's not null
74                $this->mTransliterators[$variant] = Transliterator::createFromRules( $rule );
75            }
76            foreach ( $this->getTransliteratorAliases() as $alias => $variant ) {
77                // @phan-suppress-next-line PhanTypeMismatchProperty Assume it's not null
78                $this->mTransliterators[$alias] = $this->mTransliterators[$variant];
79            }
80        }
81        return $this->mTransliterators;
82    }
83
84    /**
85     * Get the array mapping variant aliases to the main variant.
86     *
87     * @return string[]
88     */
89    protected function getTransliteratorAliases() {
90        return [];
91    }
92}
93
94/** @deprecated class alias since 1.46 */
95class_alias( LanguageConverterIcu::class, 'LanguageConverterIcu' );