|
|
@@ -23,6 +23,7 @@ namespace Cake\I18n;
|
|
|
use Aura\Intl\FormatterInterface;
|
|
|
use Aura\Intl\Package;
|
|
|
use Aura\Intl\TranslatorInterface;
|
|
|
+use Cake\I18n\PluralRules;
|
|
|
|
|
|
/**
|
|
|
* Provides missing message behavior for CakePHP internal message formats.
|
|
|
@@ -126,25 +127,8 @@ class Translator implements TranslatorInterface
|
|
|
|
|
|
// Check for missing/invalid context
|
|
|
if (isset($message['_context'])) {
|
|
|
- $context = isset($tokensValues['_context']) ? $tokensValues['_context'] : null;
|
|
|
+ $message = $this->resolveContext($key, $message, $tokensValues);
|
|
|
unset($tokensValues['_context']);
|
|
|
-
|
|
|
- // No or missing context, fallback to the key/first message
|
|
|
- if ($context === null) {
|
|
|
- if (isset($message['_context'][''])) {
|
|
|
- $message = $message['_context'][''];
|
|
|
- } else {
|
|
|
- $message = current($message['_context']);
|
|
|
- }
|
|
|
- } elseif (!isset($message['_context'][$context])) {
|
|
|
- $message = $key;
|
|
|
- } elseif (is_string($message['_context'][$context]) &&
|
|
|
- strlen($message['_context'][$context]) === 0
|
|
|
- ) {
|
|
|
- $message = $key;
|
|
|
- } else {
|
|
|
- $message = $message['_context'][$context];
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
if (!$tokensValues) {
|
|
|
@@ -156,10 +140,56 @@ class Translator implements TranslatorInterface
|
|
|
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'][''];
|
|
|
+ }
|
|
|
+
|
|
|
+ return current($message['_context']);
|
|
|
+ }
|
|
|
+ if (!isset($message['_context'][$context])) {
|
|
|
+ return $key;
|
|
|
+ }
|
|
|
+ if ($message['_context'][$context] === '') {
|
|
|
+ return $key;
|
|
|
+ }
|
|
|
+
|
|
|
+ return $message['_context'][$context];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* An object of type Package
|
|
|
*
|
|
|
* @return \Aura\Intl\Package
|