CakePHP 3.3 表专用于基于所选语言的不同数据

CakePHP 3.3 tables dedicated for different data based on the selected language

我有一个关于 CakePHP 3.3 的非标准问题。假设我的数据库中有两个 table:AB(两者相同,第一个专用于第一种语言的数据,第二个专用于第二种语言的数据语言)。

我为 table A 正确编码了整个网站(table B 尚未使用)。此外,我实现了 .po 文件机制来切换界面语言。界面语言切换正确

怎样才能轻松塞table B - 我不想在所有情况下都做出IF-ELSE声明,因为网站越来越大,而且操作很多tableA已经收录了。如果语言 pl_PL 被选择为 en_US(通过 .po 个文件)?

我想到的最简单的选择是将当前语言环境注入您现有的 table class,并让它相应地设置数据库 table 名称。

假设您现有的 table class 将被称为 SomeSharedTable,这看起来类似于:

// ...

class SomeSharedTable extends Table
{
    public function initialize(array $config)
    {
        if (!isset($config['locale'])) {
            throw new \InvalidArgumentException('The `locale` config key is missing');
        }

        $table = 'en_table';
        if ($config['locale'] === 'pl_PL') {
            $table = 'pl_table';
        }
        $this->table($table);

        // ...
    }

    // ...
}

在您的应用程序代码涉及模型层之前,当然在它设置区域设置之后(例如可能在您的 bootstrap 中),配置您在整个应用程序中使用的别名(对于此示例,我们假设别名与 table 名称匹配):

\Cake\ORM\TableRegistry::config('SomeShared', [
    'locale' => \Cake\I18n\I18n::locale()
]);

考虑到语言环境可能出于某种原因无法进入 class,您应该实施一些安全措施,我刚刚添加了基本的 isset() 检查以供示例使用.鉴于错误配置 table class 可能会导致很多问题,您可能需要添加一些更复杂的检查。