Passed
Push — master ( a42385...9b46a7 )
by Paul
04:14
created

Translator::translate()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 4.7691

Importance

Changes 0
Metric Value
cc 4
eloc 10
nc 4
nop 3
dl 0
loc 14
ccs 7
cts 11
cp 0.6364
crap 4.7691
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Modules;
4
5
use GeminiLabs\SiteReviews\Application;
6
use GeminiLabs\SiteReviews\Database\OptionManager;
7
use GeminiLabs\SiteReviews\Modules\Translation;
8
9
class Translator
10
{
11
	/**
12
	 * @param string $translation
13
	 * @param string $text
14
	 * @param string $domain
15
	 * @return string
16
	 */
17 7
	public function filterGettext( $translation, $text, $domain )
18
	{
19 7
		return $this->translate( $translation, $domain, [
20 7
			'single' => $text,
21
		]);
22
	}
23
24
	/**
25
	 * @param string $translation
26
	 * @param string $text
27
	 * @param string $context
28
	 * @param string $domain
29
	 * @return string
30
	 */
31 2
	public function filterGettextWithContext( $translation, $text, $context, $domain )
32
	{
33 2
		return $this->translate( $translation, $domain, [
34 2
			'context' => $context,
35 2
			'single' => $text,
36
		]);
37
	}
38
39
	/**
40
	 * @param string $translation
41
	 * @param string $single
42
	 * @param string $plural
43
	 * @param int $number
44
	 * @param string $domain
45
	 * @return string
46
	 */
47 1
	public function filterNgettext( $translation, $single, $plural, $number, $domain )
48
	{
49 1
		return $this->translate( $translation, $domain, [
50 1
			'number' => $number,
51 1
			'plural' => $plural,
52 1
			'single' => $single,
53
		]);
54
	}
55
56
	/**
57
	 * @param string $translation
58
	 * @param string $single
59
	 * @param string $plural
60
	 * @param int $number
61
	 * @param string $context
62
	 * @param string $domain
63
	 * @return string
64
	 */
65
	public function filterNgettextWithContext( $translation, $single, $plural, $number, $context, $domain )
66
	{
67
		return $this->translate( $translation, $domain, [
68
			'context' => $context,
69
			'number' => $number,
70
			'plural' => $plural,
71
			'single' => $single,
72
		]);
73
	}
74
75
	/**
76
	 * @param string $original
77
	 * @param string $domain
78
	 * @return string
79
	 */
80 7
	public function translate( $original, $domain, array $args )
81
	{
82 7
		if( $domain != Application::ID ) {
83 7
			return $original;
84
		}
85 7
		$args = $this->normalizeTranslationArgs( $args );
86 7
		$strings = $this->getTranslationStrings( $args['single'], $args['plural'] );
87 7
		if( empty( $strings )) {
88 7
			return $original;
89
		}
90
		$string = current( $strings );
91
		return $string['type'] == 'plural'
92
			? $this->translatePlural( $domain, $string, $args )
93
			: $this->translateSingle( $domain, $string, $args );
94
	}
95
96
	/**
97
	 * @param string $single
98
	 * @param string $plural
99
	 * @return array
100
	 */
101
	protected function getTranslationStrings( $single, $plural )
102
	{
103 7
		return array_filter( glsr( Translation::class )->translations(), function( $string ) use( $single, $plural ) {
104
			return $string['s1'] == html_entity_decode( $single, ENT_COMPAT, 'UTF-8' )
105
				&& $string['p1'] == html_entity_decode( $plural, ENT_COMPAT, 'UTF-8' );
106 7
		});
107
	}
108
109
	/**
110
	 * @return array
111
	 */
112 7
	protected function normalizeTranslationArgs( array $args )
113
	{
114
		$defaults = [
115 7
			'context' => '',
116
			'number' => 1,
117
			'plural' => '',
118
			'single' => '',
119
		];
120 7
		return shortcode_atts( $defaults, $args );
121
	}
122
123
	/**
124
	 * @param string $domain
125
	 * @return string
126
	 */
127
	protected function translatePlural( $domain, array $string, array $args )
128
	{
129
		if( !empty( $string['s2'] )) {
130
			$args['single'] = $string['s2'];
131
		}
132
		if( !empty( $string['p2'] )) {
133
			$args['plural'] = $string['p2'];
134
		}
135
		return get_translations_for_domain( $domain )->translate_plural(
136
			$args['single'],
137
			$args['plural'],
138
			$args['number'],
139
			$args['context']
140
		);
141
	}
142
143
	/**
144
	 * @param string $domain
145
	 * @return string
146
	 */
147
	protected function translateSingle( $domain, array $string, array $args )
148
	{
149
		if( !empty( $string['s2'] )) {
150
			$args['single'] = $string['s2'];
151
		}
152
		return get_translations_for_domain( $domain )->translate(
153
			$args['single'],
154
			$args['context']
155
		);
156
	}
157
}
158