ale10257 / yii2-simple-translate-module
Installs: 64
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 0
Type:yii2-extension
Requires
- phpoffice/phpspreadsheet: ^1.5
- yiisoft/yii2: ~2.0.0
This package is not auto-updated.
Last update: 2025-03-04 08:23:43 UTC
README
Цель создания модуля: научиться сохранять на "лету" необходимые термины.
Например, на сайте должно быть два языка - ru и de. В нужном месте мы пишем нужный термин, например:
TService::t('Крокодилы летят на север')
Необходимо, чтобы при первом вызове данного метода, термин 'Крокодилы летят на север' автоматически записался в БД и в кеш.
При создании, удалении, обновлении терминов кеш должен перезаписываться. Все термины должны браться из кеша приложения.
Также необходимо сформировать файл excel c терминами для переводчика(ов), и загрузить его обратно на сервер
Установка
composer require ale10257/yii2-simple-translate-module "@dev"
Соглашение об именовании полей таблицы для хранения терминов
Общепринятый формат для установки языка/локали: ll-CC, где ll — это двух или трёхбуквенный код языка в нижнем регистре в соответствии со стандартом ISO-639, а CC — это код страны в соответствии со стандартом ISO-3166.
Например, en-US, ru-Ru ...
Также в Yii2 допускается объявление локалей вида ru, de, en ...
Важно: поля таблицы для хранения терминов должны быть должны соответствовать правилам объявления переменных в языке php и правилам объявления локали (без дефиса).
Т.е., если в в конфигурационном файле приложения вы объявили локаль en-US, то поле должно именоваться enUS, если ru, то ru. C регистром ошибаться нельзя.
Настраиваем файл конфигурации
<?php
...
$languages = [
'Русский' => 'ru',
'Deutsch' => 'de',
];
$sourceLanguage = $languages['Русский'];
$basePath = dirname(__DIR__);
$config = [
...
'basePath' => $basePath,
'language' => $sourceLanguage,
'sourceLanguage' => $sourceLanguage,
...
'components' => [
...
'ale10257Translate' => [
'class' => 'ale10257\translate\ConfigTranslate',
'languages' => $languages,
// ключ кеша может быть любым
'cacheKey' => 'ale10257_translate',
// необязательная настройка tService, можно не передавать
'tService' => [
'nameSpace' => 'app\components\translate',
'path' => $basePath . '/components/translate',
]
],
...
],
'modules' => [
...
// название модуля может быть любым в рамках соглашений Yii2 о наименовании модулей
'translate' => [
'class' => 'ale10257\translate\Translate',
'as access' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
],
],
...
],
];
Создайте миграцию на основании локалей объявленных в $languages
и вышеизложенного соглашения.
php yii migrate/create create_ale10257_translate_table --fields=ru:text,de:text
Применяем миграцию:
php yii migrate
После выполнения всех настроек модуль доступен по адресу
Url::to('/' . your-name-translate-module);
Можно генерировать термины "на лету", работать с файлами excel. Для генерации терминов в нужном файле подключаем класс ale10257\translate\models\TService, и вызываем его статический метод t:
<?php
/**
* @var $this \yii\web\View
*/
use ale10257\translate\models\TService;
echo TService::t('Крокодилы летят на север');
Как и в стандартной локализации Yii2, можно передавать параметры в метод t()
, например:
<?php
/**
* @var $this \yii\web\View
*/
use ale10257\translate\models\TService;
echo TService::t( 'Крокодил летит на {path}', ['path' => 'хутор']);
Если вам лень печатать каждый раз длинные термины, и для предотвращения ошибок при наборе длинных терминов, можно организовать автодополнение для зарегистрированных терминов (проверено в IDE PhpStorm)
Для этого необходимо корректно настроить поле tService
при объявлении компонента ale10257Translate
в конфигурационном файле приложения, например:
$basePath = dirname(__DIR__);
...
'components' => [
'ale10257Translate' => [
'class' => 'ale10257\translate\ConfigTranslate',
'languages' => $languages,
'cacheKey' => 'ale10257_translate',
'tService' => [
'nameSpace' => 'app\components\translate',
'path' => $basePath . '/components/translate',
]
],
],
...
Смысл в том, что при каждом обновлении кеша для терминов, модуль ale10257\translate\Translate
генерирует рабочий класс TService
в указанной в настройках папке (path
) с указанным пространством имен ('nameSpace' => 'app\components\translate'
), в котором прописаны данные для автодополнения (в статическом поле $term
).
Путь к директории и namespace должны соответствовать стандарту PSR-4. В приведенном примере новый класс TService
будет располагаться по пути
path-your-application/components/translate
С зарегистрированным пространством имен
app\components\translate
После этих настроек нежелательно объявлять термины "на лету"!
Заходим в браузере в модуль ale10257\translate\Translate
Url::to('/' . your-name-translate-module);
- Явно создаем термин, например 'Жирафы летят на юг'
- В нужном месте подключаем новый класс
TService
и обращаемся к его статистическому методуt()
, используя статическое поле$term
Например:
<?php
use app\components\translate\TService;
echo TService::t(TService::$terms['Жирафы летят на юг']);
При наборе TService::t(TService::$terms['Ж'])
выскочит автодополнение Жирафы летят на юг (при условии корректных настроек модуля).
Как добавить локаль
В $languages
конфигурационного файла добавляем нужную локаль, например:
$languages = [
'Русский' => 'ru',
'Deutsch' => 'de',
'English' => 'en-Us',
];
И, тем или иным способом добавляем в таблицу ale10257_translate
текстовое поле, в данном случае enUS, например:
ALTER TABLE `ale10257_translate`
ADD `enUS` text NULL;
Обязательно сбрасываем кеш приложения, например:
php yii cache/flush-all