Cakephp 3.x - 国际化整页

Snn*_*_87 5 php translation internationalization cakephp-3.0

我正在使用 cakephp 3.x,我想用多种语言翻译我的网站。我阅读了cakephp 3.x 的关于国际化的文档(http://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html),它只解释了如何翻译单词和句子,但是不是整页。

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

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

谢谢你的时间

丹妮

AD7*_*six 5

国际化和本地化有两个基本任务,在这两种情况下,目的都是在运行时更改语言唯一需要做的就是调用 I18n::locale例如:

use Cake\I18n\I18n;
...
public function beforeFilter()
{
    if (should show german) {
        I18n::locale('de_DE');
    }
}
Run Code Online (Sandbox Code Playgroud)

设置完成后,无需额外步骤即可拥有多语言站点。确保在引导程序文件中设置默认语言环境,因为如果在运行时没有覆盖语言环境,就会使用默认语言环境

静态内容

认为要做的是为每种语言都有一个页面并在beforeFilter函数中选择正确的页面。这是一个很好的解决方案吗?

不。

静态文件,除非您打算为每种语言或类似语言提供根本不同的页面布局,否则通常是使用翻译函数和 po 文件的单个模板。

从文档:

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

<h2>Popular Articles</h2>
Run Code Online (Sandbox Code Playgroud)

为了国际化你的代码,你需要做的就是将字符串包裹在 __() 中,如下所示:

<h2><?= __('Popular Articles') ?></h2>
Run Code Online (Sandbox Code Playgroud)

涉及的步骤更多(请参阅文档),但是将双下划线方法与您的默认语言文本一起使用可以让您的应用程序准备好用于多种语言。

动态内容

数据库内容通常使用翻译行为进行翻译

此行为将使用该行为的所有表的所有翻译内容存储在单独的表中。在运行时自动检索翻译。为了显示:

$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'
Run Code Online (Sandbox Code Playgroud)

把这一切放在一起

使用静态翻译和翻译行为,您的模板文件将如下所示:

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

请注意,除了使用双下划线方法外,它与您对单一语言应用程序的期望完全相同。


ecl*_*ude 3

嗨对我来说最好的方法是:

初始化 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)
);
Run Code Online (Sandbox Code Playgroud)

将翻译行为附加到您的表

class ArticlesTable extends Table
{

    public function initialize(array $config)
    {
        $this->addBehavior('Translate', ['fields' => ['title', 'body']]);
    }
}
Run Code Online (Sandbox Code Playgroud)

首先要注意的是,您需要在配置数组中传递字段键。需要此字段列表来告诉行为哪些列将能够存储翻译。

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

class Article extends Entity
{
    use TranslateTrait;
}
Run Code Online (Sandbox Code Playgroud)

保存多个翻译

$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);
Run Code Online (Sandbox Code Playgroud)

阅读翻译内容

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

// All entities in results will contain english translation
$results = $articles->find()->all();
Run Code Online (Sandbox Code Playgroud)

CakePHP:翻译

CakePHP:国际化和本地化