Sorry guys I don't speak Chinese. I want to implement a custom translation loader in my webman app. The goal is to get translations from a remote database.
"workerman/webman-framework": "1.3.14",
"symfony/translation": "^5.3",
./src
├── app
│ ├── constant
│ ├── controller
│ ├── exception
│ ├── extension
│ │ ├── constant
│ │ ├── interfaces
│ │ ├── model
│ │ └── traits
│ ├── middleware
│ ├── model
│ │ ├── constant
│ │ │ └── properties
│ │ └── filter
│ ├── observer
│ ├── queue
│ │ └── redis
│ ├── service
│ ├── tools
│ ├── validation
│ └── view
│ └── index
├── config
├── coverage
│ └── phpunit
│ └── html
│ ├── _css
│ ├── _icons
│ └── _js
├── data
│ └── api-redis-service
│ ├── lib
│ └── redis.conf
├── database
│ ├── migrations
│ └── seeds
│ ├── mails
│ │ ├── en
│ │ └── fr
│ └── mails.prod.10-2023
│ ├── en
│ └── fr
├── docker
│ └── php
├── process
├── public
├── resource
│ ├── files
│ │ ├── absence_demands
│ │ ├── exports
│ │ │ ├── absence_amounts
│ │ │ ├── absence_demands
│ │ │ └── absence_demands_waiting_validation
│ │ ├── imports
│ │ │ └── absence_amounts
│ │ └── ml_data
│ │ ├── doc
│ │ ├── docx
│ │ ├── gif
│ │ ├── jpeg
│ │ ├── jpg
│ │ ├── pdf
│ │ └── png
│ └── translations
│ ├── en
│ └── fr
├── runtime
│ ├── annotation
│ ├── cache
│ ├── logs
│ ├── sessions
│ └── views
├── support
│ ├── bootstrap
│ │ └── db
│ ├── command
│ │ ├── oga
│ │ │ └── translation
│ │ ├── phinx
│ │ └── workerman
│ │ └── process
│ ├── events
│ ├── exception
│ ├── middleware
│ └── view
└── test
├── absences
│ ├── agenda
│ └── demands
│ └── validations
├── auth
└── users
92 directories
I already tried to change the src/support/bootstrap/Translation.php file, to load all translation messages form database but it seems not working, It seems to always load the translations from the resources directory.
Here is the content of my src/support/bootstrap/Translation.php now :
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace support\bootstrap;
use Webman\Bootstrap;
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\Loader\PhpFileLoader;
/**
* Class Translation
* @package support\bootstrap
* @method static string trans(?string $id, array $parameters = [], string $domain = null, string $locale = null)
* @method static void setLocale(string $locale)
* @method static string getLocale()
*/
class Translation implements Bootstrap
{
/**
* @var array
*/
protected static $_translator = [];
/**
* @param \Workerman\Worker $worker
* @return void
*/
public static function start($worker)
{
if (!class_exists('\Symfony\Component\Translation\Translator')) {
return;
}
$config = config('translation', []);
if (!$translations_path = realpath($config['path'])) {
return;
}
static::$_translator = $translator = new Translator($config['locale']);
$translator->setFallbackLocales($config['fallback_locale']);
$classes = [
\app\extension\DatabaseTranslationLoader::class => [
'extension' => '.db',
'format' => 'custom_db',
'type' => 'db',
],
/*\Symfony\Component\Translation\Loader\PhpFileLoader::class => [
'extension' => '.php',
'format' => 'phpfile',
'type' => 'file',
],
\Symfony\Component\Translation\Loader\PoFileLoader::class => [
'extension' => '.po',
'format' => 'pofile',
'type' => 'file',
],*/
];
foreach ($classes as $class => $opts) {
$translator->addLoader($opts['format'], new $class);
if ($opts['type'] == 'db') {
$dbLocale = \app\extension\DatabaseTranslationLoader::loadLocaleFromDb();
$dbDomain = \app\extension\DatabaseTranslationLoader::loadDomainFromDb();
foreach ($dbLocale as $oneLocale) {
foreach ($dbDomain as $oneDomain) {
$resourceName = $opts['format'] . "_" . $oneLocale . "_" . $oneDomain;
$translator->addResource(
format: $opts['format'],
resource: $resourceName,
locale: $oneLocale,
domain: $oneDomain
);
}
}
} else {
foreach (glob($translations_path . DIRECTORY_SEPARATOR . '*' . DIRECTORY_SEPARATOR . '*' . $opts['extension']) as $file) {
$domain = basename($file, $opts['extension']);
$dir_name = pathinfo($file, PATHINFO_DIRNAME);
$locale = substr(strrchr($dir_name, DIRECTORY_SEPARATOR), 1);
if ($domain && $locale) {
$translator->addResource($opts['format'], $file, $locale, $domain);
}
}
}
}
}
/**
* @param $name
* @param $arguments
* @return mixed
*/
public static function __callStatic($name, $arguments)
{
return static::$_translator->{$name}(...$arguments);
}
}