/
Translator.php
118 lines (102 loc) · 3.63 KB
/
Translator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
/**
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
* @link https://cakephp.org CakePHP(tm) Project
*/
namespace Cake\I18n;
use Aura\Intl\Translator as BaseTranslator;
/**
* Provides missing message behavior for CakePHP internal message formats.
*
* @internal
*/
class Translator extends BaseTranslator
{
const PLURAL_PREFIX = 'p:';
/**
* Translates the message formatting any placeholders
*
*
* @param string $key The message key.
* @param array $tokensValues Token values to interpolate into the
* message.
* @return string The translated message with tokens replaced.
*/
public function translate($key, array $tokensValues = [])
{
if (isset($tokensValues['_count'])) {
$message = $this->getMessage(static::PLURAL_PREFIX . $key);
if (!$message) {
$message = $this->getMessage($key);
}
} else {
$message = $this->getMessage($key);
if (!$message) {
$message = $this->getMessage(static::PLURAL_PREFIX . $key);
}
}
if (!$message) {
// Fallback to the message key
$message = $key;
}
// Check for missing/invalid context
if (isset($message['_context'])) {
$message = $this->resolveContext($key, $message, $tokensValues);
unset($tokensValues['_context']);
}
if (!$tokensValues) {
// Fallback for plurals that were using the singular key
if (is_array($message)) {
return array_values($message + [''])[0];
}
return $message;
}
// Singular message, but plural call
if (is_string($message) && isset($tokensValues['_singular'])) {
$message = [$tokensValues['_singular'], $message];
}
// Resolve plural form.
if (is_array($message)) {
$count = isset($tokensValues['_count']) ? $tokensValues['_count'] : 0;
$form = PluralRules::calculate($this->locale, $count);
$message = isset($message[$form]) ? $message[$form] : (string)end($message);
}
if (strlen($message) === 0) {
$message = $key;
}
return $this->formatter->format($this->locale, $message, $tokensValues);
}
/**
* Resolve a message's context structure.
*
* @param string $key The message key being handled.
* @param string|array $message The message content.
* @param array $vars The variables containing the `_context` key.
* @return string
*/
protected function resolveContext($key, $message, array $vars)
{
$context = isset($vars['_context']) ? $vars['_context'] : null;
// No or missing context, fallback to the key/first message
if ($context === null) {
if (isset($message['_context'][''])) {
return $message['_context'][''] === '' ? $key : $message['_context'][''];
}
return current($message['_context']);
}
if (!isset($message['_context'][$context])) {
return $key;
}
if ($message['_context'][$context] === '') {
return $key;
}
return $message['_context'][$context];
}
}