나는이 오래 알고 있지만, 그것이 답이고 내가 이것을 알아내는 몇 가지 문제에있어 있기 때문에, 여기 내 두 센트 :
범위, 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}');");
}
}
}
}
팁 : 로케일, 모델, foreign_key 및 필드 키를 사용하여 국제화 테이블의 고유 인덱스를 만들 수 있습니다.
이제 모든 언어로 원본 데이터를 복제 했으므로 이제는 주어진 언어로 새 레코드를 만들 수 있어야합니다. 문제는 영어로 새 레코드를 만들면 스페인어로 업데이트 할 수 있지만 스페인어로는 i18n 레코드가 없으므로 CMS에서 레코드를 볼 수 없어 편집 할 수 없습니다. 이 방법은 새 레코드를 만들 때 모든 언어에 대해 i18n 레코드를 만드는 것이지만 레코드를 편집 할 때 현재 언어로만 편집해야합니다.
은 내가 번역 행동이 수정을 사용 :
http://bin.cakephp.org/view/1939852942
그러나이 변경 대부분의 예는 형태의 폼 입력을 만들 필요가 있다고 말했다 : ( 는 $ this- 에코> 서식 -> 입력의 이름을 .eng '); echo $ this-> Form-> input ('name.spa'); echo $ this-> Form-> input ('description.eng'); echo $ this-> Form-> input ('description.spa');
난이 성가신 발견, 그래서 기본적으로 app_controller에서 도우미 기능이 데이터 구조로 변환 가능한 필드로 변환했다 :
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)
{
이 방법 I :
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;
}
모든에
메소드 추가 전통적인 양식을 사용할 수 있으며 새로운 언어를 추가하면보기를 변경할 필요가 없습니다. 유효성 검사를 위해 제출 된 데이터가 필요하지만 저장을 위해 수정 된 데이터가 필요하기 때문에 tradicional baked add 메소드를 수정해야합니다.
http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/
을 그래서 기본적으로 그거야 :
마지막으로, 나는이 사이트/관리자 내에서 언어를 변경하는 단계를 따랐다. 1. DB에 이미있는 모든 데이터에 대해 번역을 만듭니다. 각 데이터는 모든 언어로 복사됩니다. 2. 생성시 새 레코드에 대한 모든 변환을 만듭니다. 모두 동일한 값을 사용합니다. 3. 선택한 번역에서 모든 레코드를 편집하십시오.
두 번째 대답은 "아니오"로 표시됩니다. –