CakePHP3.x-国际化一整页

CakePHP3.x-国际化一整页,php,internationalization,translation,cakephp-3.0,Php,Internationalization,Translation,Cakephp 3.0,我正在使用cakephp 3.x,我想用几种语言翻译我的网站。我阅读了关于CakePHP3.x国际化()的文档,它只解释了如何翻译单词和句子,而不是一整页 翻译整页文本的最佳解决方案是什么?我认为应该为每种语言创建一个页面,并在beforeFilter函数中选择正确的页面。这是一个好的解决方案吗 我也在问如何翻译保存在数据库中的某个段落,例如,我的新闻页面保存在数据库中,我希望有一个不同语言的新闻版本。我必须为数据库中的每种语言添加一行,还是有更好的解决方案 谢谢你的时间 Dany嗨,对我来说,

我正在使用cakephp 3.x,我想用几种语言翻译我的网站。我阅读了关于CakePHP3.x国际化()的文档,它只解释了如何翻译单词和句子,而不是一整页

翻译整页文本的最佳解决方案是什么?我认为应该为每种语言创建一个页面,并在beforeFilter函数中选择正确的页面。这是一个好的解决方案吗

我也在问如何翻译保存在数据库中的某个段落,例如,我的新闻页面保存在数据库中,我希望有一个不同语言的新闻版本。我必须为数据库中的每种语言添加一行,还是有更好的解决方案

谢谢你的时间


Dany

嗨,对我来说,最好的办法是:

初始化i18n数据库表

CREATE TABLE i18n (
    id int NOT NULL auto_increment,
    locale varchar(6) NOT NULL,
    model varchar(255) NOT NULL,
    foreign_key int(10) NOT NULL,
    field varchar(255) NOT NULL,
    content text,
    PRIMARY KEY     (id),
    UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field),
    INDEX I18N_FIELD(model, foreign_key, field)
);
将转换行为附加到表

class ArticlesTable extends Table
{

    public function initialize(array $config)
    {
        $this->addBehavior('Translate', ['fields' => ['title', 'body']]);
    }
}
首先要注意的是,您需要在配置数组中传递字段键。需要此字段列表来告诉行为哪些列能够存储翻译

use Cake\ORM\Behavior\Translate\TranslateTrait;
use Cake\ORM\Entity;

class Article extends Entity
{
    use TranslateTrait;
}
保存多个翻译

$translations = [
    'en_US' => ['title' => "An article"],
    'fr_FR' => ['title' => "Un article"]
];

foreach ($translations as $lang => $data) {
    $article->translation($lang)->set($data, ['guard' => false]);
}

$articles->save($article);
阅读翻译内容

I18n::locale('en_US');
$articles = TableRegistry::get('Articles');

// All entities in results will contain english translation
$results = $articles->find()->all();

有两个基本任务,在这两种情况下,目的都是在运行时更改语言只需执行以下操作:

一旦建立了一个多语言网站,就没有额外的步骤了。请确保在引导文件中输入,因为这是在运行时未重写区域设置时使用的

静态内容 您需要做的是为每种语言创建一个页面,并在beforeFilter函数中选择正确的页面。这是一个好的解决方案吗

没有

静态文件,除非您希望每种语言或类似语言有根本不同的页面布局,通常是使用和po文件的单个模板

从文档中:

下面是单语言应用程序的一些代码示例:

<h2>Popular Articles</h2>
把它们放在一起 使用静态转换和转换行为,模板文件将如下所示:

<h1><?= h($article->title) ?></h1>
<?= $article->body ?>
<p><?= __('Did you like that article? Let us know') ?></p>

请注意,由于使用了双下划线方法,它与单语言应用程序的预期完全相同

<h2><?= __('Popular Articles') ?></h2>
$articles = TableRegistry::get('Articles');

I18n::locale('eng');
$article = $articles->get(12);
echo $article->title; // Echoes 'A title'

I18n::locale('spa');
$article = $articles->get(12);
echo $article->title; // Echoes 'Un titulo'
<h1><?= h($article->title) ?></h1>
<?= $article->body ?>
<p><?= __('Did you like that article? Let us know') ?></p>