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