我有一个 Laravel 应用程序。假设我们有一个包含 3 个输入字段和 3 个标签的表单。假设我们有 100 个主题,每个客户端/主题都需要自定义标签文本。因此输入是相同的,只是标签中的文本不同。 例如。
主题 1 想要:民意调查和测验,主题 2 想要:我的民意调查和测验,主题 3 想要:民意调查,主题 4 想要:测验,等等... 我们还假设我们的网站是双语的。
现在,我们正在使用英语和法语列名称保存数据库中的字段,但是如果我们有数千个想要自定义的字段,那么最好的方法是什么,因为保存了数千个文本列数据库中的名称似乎不是正确的答案。
重要提示: 当涉及到主题时,我们正在尝试拥有一个 WordPress 风格的应用程序。 我知道 Laravel 中有主题包,我们正在使用一个(qiro lab theme laravel),但它只讨论处理资产,而不是如何处理每个主题的多语言文本。附:我现在看到有更流行/更好的 Laravel 主题包,我会研究这些。
我的问题是关于本地化的 我确定我错过了一些东西,每个主题是否可以有多个资源/语言/文件夹?这里最好的方法是什么?
您可以通过在 resources/lang 目录下为每个主题创建单独的文件夹来组织本地化文件。例如:
├── lang
├── theme1
│ ├── en
│ │ └── theme.php
│ └── fr
│ └── theme.php
├── theme2
│ ├── en
│ │ └── theme.php
│ └── fr
│ └── theme.php
└── ...
在此之后你可以实现这个:
在会话中设置主题:
当主题更改或最初设置时,将其存储在会话中。例如:
// Set theme in session
session(['theme' => 'theme1']); // or 'theme2'
自定义语言加载器:
扩展 Laravel 的语言加载器,以根据会话中存储的主题从适当的主题目录加载语言文件。您可以通过创建自定义语言加载器来做到这一点。这是一个基本示例:
namespace App\Providers;
use Illuminate\Translation\FileLoader;
use Illuminate\Filesystem\Filesystem;
class CustomFileLoader extends FileLoader
{
protected function loadPath($path, $locale, $group)
{
$theme = session('theme');
// Customize path based on the theme
$customPath = "{$path}/{$theme}/{$locale}/{$group}.php";
if ($this->files->exists($customPath)) {
return $this->files->getRequire($customPath);
}
return parent::loadPath($path, $locale, $group);
}
}
注册自定义语言加载器:
在您的
AppServiceProvider
中,绑定自定义语言加载器:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('translator.loader', function ($app) {
return new CustomFileLoader(new Filesystem, $app['path.lang']);
});
}
}