gpt4 book ai didi

cakephp - 事后应用 CakePHP 的翻译行为

转载 作者:行者123 更新时间:2023-12-04 07:08:28 25 4
gpt4 key购买 nike

我正在慢慢学习如何应用 CakePHP 的翻译行为,我想我已经掌握了基础知识,但我正在使用现有数据处理现有项目。 Cake 会为我插入新记录很棒,但我需要手动(我假设)为一些现有数据插入一些翻译。我的第一个问题:

如果 en_us 是我的默认语言和我的核心表中使用的语言,我是否必须在我的 i18n 表中为 en_us 记录?例如,如果categories.name = 'Entertainment',我真的需要在i18n中创建一个“重复”记录来指示指定“Entertainment”的英文翻译吗?经验证据似乎是肯定的,但这似乎需要很多额外的工作,所以我希望有人能告诉我我遗漏了一些东西。

其次,是否有一种“简单”的方法可以将翻译记录导入数据库?由于在项目过程中添加了语言,因此返回并为遗留数据创建 i18n 记录将非常痛苦。

谢谢。

最佳答案

我知道这是旧的,但由于它没有得到答复并且我在弄清楚这一点时遇到了一些麻烦,这是我的两分钱:

范围,Cakephp 1.3。

首先,您的应用程序中的每个字段 -> 记录 -> 模型都需要一个 i18n 记录,当然只有具有翻译行为的模型并且仅适用于指定的字段,所以是的,您最终会在实际模型字段和 i18n 表。

此外,您需要为 find 方法指定的任何语言的现有翻译来返回任何内容。这让我感到困惑,因为我还将翻译行为添加到了一个已经开发的项目中,其中包含大量数据。基本上我所做的是创建一个同步方法,以便为具有翻译行为的每个模型的每个字段创建每个翻译。如果我将来添加一种新语言,我将不得不再次运行它。

这是代码:

$locales = array( 'spa', 'eng', 'por' );
$models = array( 'Event', 'News', 'Promotion', 'Shop', 'ShopCategory' );

foreach ( $models as $model )
{
$this->loadModel( $model );
$records = $this->{$model}->find( 'all', array(
'fields' => array( "*" ),
'contain' => FALSE
) );

$fields = $this->{$model}->actsAs['Translate'];
foreach ( $records as $record )
{
foreach ( $fields as $field )
{
foreach ( $locales as $locale )
{
$content = mysql_real_escape_string( $record[$model][$field] );
$this->{$model}->query( "INSERT INTO `i18n` (`locale`, `model`, `foreign_key`, `field`, `content`) VALUES('{$locale}', '{$model}', '{$record[$model]['id']}', '{$field}', '{$content}');" );
}
}
}
}

提示:在 i18n 表中使用 locale、model、foreign_key 和 field 键创建唯一索引。

所以,既然我已经用所有语言复制了我的原始数据,我需要能够用给定的语言创建新记录。问题是,如果我用英语创建新记录,我应该可以用西类牙语更新它,但是由于没有西类牙语的 i18n 记录,我无法在我的 CMS 中看到该记录,也无法对其进行编辑。
我解决这个问题的方法是在创建新记录时为每种语言创建 i18n 记录,但在编辑记录时只使用当前语言进行编辑。

我将此修改用于翻译行为:
http://bin.cakephp.org/view/1939852942

但是大多数带有此修改的示例都说您必须在表单中创建表单输入:
echo $this->Form->input('name.eng');
echo $this->Form->input('name.spa');
echo $this->Form->input('description.eng');
echo $this->Form->input('description.spa');

我觉得这很烦人,所以我基本上在 app_controller 中创建了一个辅助函数来将可翻译字段转换为这个数据结构:
function _expandLocalizations( $data )
{
foreach ( $data as $modelName => $modelData )
{
if ( !isset( $modelData[$this->{$modelName}->primaryKey] ) )
{
foreach ( $this->{$modelName}->actsAs['Translate'] as $field )
{
$translations = array();
foreach ( $this->languages as $language )
{
$translations[$language] = $this->data[$modelName][$field];
}
$data[$modelName][$field] = $translations;
}
}
}
return $data;
}

并且在每个 add 方法中:
if ( !empty( $this->data ) )
{
$this->News->set( $this->data );
if ( $this->News->validates() )
{
$this->News->create();
$data = $this->_expandLocalizations( $this->data );
$saved = $this->News->save( $data );
if ( $saved )
{

这样我就可以使用传统的表格,而且如果我添加新的语言,我不需要改变 View 。
我需要修改传统的烘焙添加方法,因为我需要提交的数据进行验证,但修改后的数据用于保存。

最后,我按照以下步骤更改站点/管理员中的语言: http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/

所以基本上就是这样。
1. 您为数据库中已有的每个数据创建翻译,每个数据都复制到每种语言。
2. 在 create 上为新记录创建每个翻译,当然所有的值都相同。
3. 编辑所选翻译中的每条记录。

关于cakephp - 事后应用 CakePHP 的翻译行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/744802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com