2009-04-13 4 views
2

저는 CakePHP의 번역 동작을 적용하는 방법을 천천히 배우고 있습니다. 기본을 파악한 것 같지만 기존 데이터가있는 기존 프로젝트로 작업하고 있습니다. Cake가 새로운 레코드를 삽입하는 것은 대단한 일이지만 수동으로 (기존의) 일부 데이터에 대해 몇 가지 번역본을 삽입해야합니다. 내 첫 번째 질문 :사실 이후의 CakePHP 번역 동작 적용

내 기본 테이블과 내 코어 테이블에 사용되는 언어 인 경우 en_us에 대한 내 i18n 테이블에 레코드가 있어야합니까? 예를 들어 categories.name = 'Entertainment'인 경우 "Entertainment"의 영어 번역을 지정하기 위해 i18n에 "duplicate"레코드를 만들어야합니까? 경험적 증거는 그렇다고 말하고있는 것처럼 보입니다. 그러나 그것은 많은 추가 작업처럼 보입니다. 누군가 내가 뭔가를 놓치고 있다고 말할 수 있기를 바랍니다.

둘째, 번역 레코드를 데이터베이스에 가져 오는 "쉬운"방법이 있습니까? 프로젝트가 진행되는 동안 언어가 추가됨에 따라 기존 데이터에 대한 i18n 레코드를 만들고 다시 작성하는 것은 정말 힘들 것입니다.

감사합니다.

답변

0

두 번째 질문에 대한 답변이 없지만 첫 번째 질문에 대한 대답은 "예"인 것 같습니다. 소스 코드를 살펴보면 생성 된 쿼리의 where 절이 검색되는 필드 이름에 현재 로캘에 대한 로캘 값이있는 결과를 제한하는 것처럼 보입니다. 그것은 꽤 제한적입니다.

여기에는 existing ticket (또는 이와 유사한 내용)이 있습니다.

+0

두 번째 대답은 "아니오"로 표시됩니다. –

3

나는이 오래 알고 있지만, 그것이 답이고 내가 이것을 알아내는 몇 가지 문제에있어 있기 때문에, 여기 내 두 센트 :

범위, 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. 선택한 번역에서 모든 레코드를 편집하십시오.

0

많은 열이있는 번역 동작을 사용하면 사이트 속도가 크게 저하됩니다. 속도를 높이는 가장 간단한 방법은이 색인을 추가하는 것입니다. 이 색인은 cakephp/app/Config/Schema/i18n.sql에 주석 처리되었으며 이유는 알 수 없습니다.

ALTER TABLE rabotvins_i18n 
ADD UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field);