Блог

Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих

Бхаргава Адитья.  Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих

Алгоритмы - это всего лишь последовательность решения задач, и большинство таких задач уже были кем-то решены, протестированы и проверены. Можно, конечно, погрузиться в глубокую философию гениального Кнута, изучить многостраничные фолианты с доказательствами и обоснованиями, но хотите ли вы тратить на это свое время? Откройте великолепно иллюстрированную книгу и вы сразу поймете, что алгоритмы - это просто. А грокать алгоритмы - это веселое и увлекательное занятие
Читать
Распределенные системы. Паттерны проектирования

Брендан Бернс.  Распределенные системы. Паттерны проектирования

Современный мир попросту немыслим без использования распределенных систем. Даже у простейшего мобильного приложения есть API, через который оно подключается к облачному хранилищу. Однако, проектирование распределенных систем до сих пор остается искусством, а не точной наукой. Необходимость подвести под нее серьезный базис назрела давно, и, если вы хотите обрести уверенность в создании, поддержке и эксплуатации распределенных систем - начните с этой книги! Брендан Бёрнс, авторитетнейший специалист по облачным технологиям и Kubernetes, излагает в этой небольшой работе абсолютный минимум, необходимый для правильного проектирования распределенных систем. Эта книга описывает неустаревающие паттерны проектирования распределенных систем. Она поможет вам не только создавать такие системы с нуля, но и эффективно переоборудовать уже имеющиеся.
Читать
Высоконагруженные приложения. Программирование, масштабирование, поддержка

Клеппман Мартин.  Высоконагруженные приложения. Программирование, масштабирование, поддержка

В этой книге вы найдете ключевые принципы, алгоритмы и компромиссы, без которых не обойтись при разработке высоконагруженных систем для работы с данными. Материал рассматривается на примере внутреннего устройства популярных программных пакетов и фреймворков. В книге три основные части, посвященные, прежде всего, теоретическим аспектам работы с распределенными системами и базами данных. От читателя требуются базовые знания SQL и принципов работы баз данных.
Читать
Чистая архитектура. Искусство разработки программного обеспечения

Мартин Роберт.  Чистая архитектура. Искусство разработки программного обеспечения

"Идеальный программист" и "Чистый код" - легендарные бестселлеры Роберта Мартина - рассказывают, как достичь высот профессионализма. "Чистая архитектура" продолжает эту тему, но не предлагает несколько вариантов в стиле "решай сам", а объясняет, что именно следует делать, по какой причине и почему именно такое решение станет принципиально важным для вашего успеха. Роберт Мартин дает прямые и лаконичные ответы на ключевые вопросы архитектуры и дизайна. "Чистую архитектуру" обязаны прочитать разработчики всех уровней, системные аналитики, архитекторы и каждый программист, который желает подняться по карьерной лестнице или хотя бы повлиять на людей, которые занимаются данной работой. Все архитектуры подчиняются одним и тем же правилам!
Читать

Yii::t('app', 'message') -> trans('app.category.sub_category.message')

Переопределяем метод PhpMessageSource::loadMessages()


namespace app\components;

use Yii;

class PhpMessageSource extends \yii\i18n\PhpMessageSource
{
    protected function loadMessages($category, $language)
    {
        $newCategory = $category;
        $keys = [];
        if (false !== strpos($category, '.')) {
            $keys = explode('.', $category);
            $newCategory = array_shift($keys);
        }
        $messageFile = $this->getMessageFilePath($newCategory, $language);
        $messages = $this->loadMessagesFromFile($messageFile);

        if (false !== strpos($category, '.')) {
            $messages = $this->searchKey($messages, $keys);
        }

        $fallbackLanguage = substr($language, 0, 2);
        $fallbackSourceLanguage = substr($this->sourceLanguage, 0, 2);

        if ($language !== $fallbackLanguage) {
            $messages = $this->loadFallbackMessages($newCategory, $fallbackLanguage, $messages, $messageFile);
        } elseif ($language === $fallbackSourceLanguage) {
            $messages = $this->loadFallbackMessages($newCategory, $this->sourceLanguage, $messages, $messageFile);
        } else {
            if ($messages === null) {
                Yii::warning("The message file for category '$newCategory' does not exist: $messageFile", __METHOD__);
            }
        }

        return (array)$messages;
    }

    private function searchKey($messages, $keys)
    {
        $keyCurrent = array_shift($keys);

        if (array_key_exists($keyCurrent, $messages) && is_array($messages[$keyCurrent])) {
            if (!$keys) {
                return $messages[$keyCurrent];
            }

            return $this->searchKey($messages[$keyCurrent], $keys);
        }
    }
}

В конфиге приложения для компонента i18n указываем наш класс:


'components' => [
    ...
    'i18n' => [
            'translations' => [
                '*' => [
                    'class' => \app\components\PhpMessageSource::class,
    ...

Добавляем глобальную функцию, которая будет оберткой для стандартного вызова метода Yii::t()


function trans(string $message)
{
    return Yii::t($message, substr(strrchr($message, '.'), 1));
}

Теперь в файлах переводов можно указывать переводы с категориями


'access_denied' => 'Доступ закрыт',
'category' => [
    'sub_category' => [
        'message' => 'Сообщение',
    ],
],

Интернационализация Yii2 а-ля Laravel.  Интернационализация Yii2 а-ля Laravel

I18n а-ля Laravel
Читать

Подпишитесь на обновления