'translated message 1', * 'original message 2' => 'translated message 2', * ]; * ~~~ * * You may use [[fileMap]] to customize the association between category names and the file names. * * @author Qiang Xue * @since 2.0 */ class PhpMessageSource extends MessageSource { /** * @var string the base path for all translated messages. Defaults to null, meaning * the "messages" subdirectory of the application directory (e.g. "protected/messages"). */ public $basePath = '@app/messages'; /** * @var array mapping between message categories and the corresponding message file paths. * The file paths are relative to [[basePath]]. For example, * * ~~~ * [ * 'core' => 'core.php', * 'ext' => 'extensions.php', * ] * ~~~ */ public $fileMap; /** * Loads the message translation for the specified language and category. * If translation for specific locale code such as `en-US` isn't found it * tries more generic `en`. * * @param string $category the message category * @param string $language the target language * @return array the loaded messages. The keys are original messages, and the values * are translated messages. */ protected function loadMessages($category, $language) { $messageFile = $this->getMessageFilePath($category, $language); $messages = $this->loadMessagesFromFile($messageFile); $fallbackLanguage = substr($language, 0, 2); if ($fallbackLanguage != $language) { $fallbackMessageFile = $this->getMessageFilePath($category, $fallbackLanguage); $fallbackMessages = $this->loadMessagesFromFile($fallbackMessageFile); if ($messages === null && $fallbackMessages === null && $fallbackLanguage != $this->sourceLanguage) { Yii::error("The message file for category '$category' does not exist: $messageFile Fallback file does not exist as well: $fallbackMessageFile", __METHOD__); } else if (empty($messages)) { return $fallbackMessages; } else if (!empty($fallbackMessages)) { foreach ($fallbackMessages as $key => $value) { if (!empty($value) && empty($messages[$key])) { $messages[$key] = $fallbackMessages[$key]; } } } } else { if ($messages === null) { Yii::error("The message file for category '$category' does not exist: $messageFile", __METHOD__); } } return (array)$messages; } /** * Returns message file path for the specified language and category. * * @param string $category the message category * @param string $language the target language * @return string path to message file */ protected function getMessageFilePath($category, $language) { $messageFile = Yii::getAlias($this->basePath) . "/$language/"; if (isset($this->fileMap[$category])) { $messageFile .= $this->fileMap[$category]; } else { $messageFile .= str_replace('\\', '/', $category) . '.php'; } return $messageFile; } /** * Loads the message translation for the specified language and category or returns null if file doesn't exist. * * @param $messageFile string path to message file * @return array|null array of messages or null if file not found */ protected function loadMessagesFromFile($messageFile) { if (is_file($messageFile)) { $messages = include($messageFile); if (!is_array($messages)) { $messages = []; } return $messages; } else { return null; } } }