t ()를 통해 변수를 전달하는 것이 항상 나쁜가요?


13

내 hook_schema에 대한 작은 도우미 기능이 있습니다.

function _bbcmap_schema_asr_field($description) {
  return array(
    'type' => 'int',
    'unsigned' => TRUE,
    'size' => 'small', // Up to ~66k with MySQL (equivalent up to ~660.00 adjusted)
    'not null' => FALSE,
    'description' => t($description),
  );
}

그런 다음 다음과 같이 사용할 수 있습니다.

/**
 * Implements hook_schema().
 */
function bbcmap_schema() {
  $schema['la_data'] = array(
    'fields' => array(
      ...
      'mort_asr_male' =>    _bbcmap_schema_asr_field('The age standardised mortality amongst men (fixed point with scale factor 1/100)'),
      'mort_asr_female' =>  _bbcmap_schema_asr_field('The age standardised mortality amongst women (fixed point with scale factor 1/100)'),
      'incid_asr_male' =>   _bbcmap_schema_asr_field('The age standardised incidence amongst men (fixed point with scale factor 1/100)'),
      'incid_asr_female' => _bbcmap_schema_asr_field('The age standardised incidence amongst women (fixed point with scale factor 1/100)'),
      ...
    ),
  );
}

가이드 라인이 변수를 전달 t()하지는 않지만 메뉴 시스템이 콜백 제목을 t()(기본적으로) 전달하는 방법과 매우 유사합니다 . 이 스타일에 대한 의견이 있습니까?

답변:


17

의 첫 번째 인수 t()는 리터럴 문자열이어야하며 다음을 제외합니다.

  • 변수, 함수의 매개 변수까지 : t($description)
  • 문자열의 연결 : t('If you want to add a link, click on' . '<a href="http://example.com">this link</a>.')
  • 함수에서 반환 된 값 :t(get_menu_description())
  • 상수 : t(MYMODULE_MY_WIDGET_TITLE),t(MyClass::WIDGET_TITLE)

그 이유는 몇 가지 특정 후크 (예를 들어 hook_menu(),, hook_perm())를 hook_permission()제외하고, 번역 할 문자열이 모듈의 코드를 스캔하는 스크립트에서 발견되어 다음과 같은 코드를 찾는 것입니다 t('This is an example.'). 변수 값과 같이 런타임에 의존하는 값을 찾으면 코드가 실행될 때마다 변수에 다른 값이 포함될 수 있으므로 스크립트는 어떤 문자열을 변환해야하는지 이해할 수 없습니다. 실제로 http://localize.drupal.org 는 인수 t()가 리터럴 문자열이 아닌 경우 다음과 유사한 경고를보고 합니다.

첫 번째 매개 변수 t()는 리터럴 문자열이어야합니다. 변수, 연결, 상수 또는 기타 문자가 아닌 문자열이 없어야합니다. 에서 t($filter['name'])라인 (30)에에는, customFilter / customfilter.module있다.

에 동적 값을 전달하는 경우 t()번역 할 문자열을 추출하는 스크립트는 값을 추출하지 않습니다. 효과는 전달 t()되지 않은 인수 가 변환되지 않으므로 t()사용자 인터페이스에서 동적 출력을 직접 사용 하지 않는 것과 동일한 효과를 갖습니다 . 문자열이 변환되는 유일한 경우는 동적 문자열이 함수가 전달하는 리터럴 문자열과 같은 경우 t()입니다. 예를 들어 현재 달의 이름을 반환하는 함수가 포함 된 Drupal을 생각하지 않은 라이브러리가 있다고 가정합니다. 다음 코드를 사용하면 해당 함수에서 반환 된 값이 변환됩니다.

function mymodule_calendar_page_title() {
  return t(Calendar::getCurrentMonth());
}

function mymodule_calendar_translations() {
  $translations = array(
    t('January'),
    t('February'),
    t('March'),
    t('April'),
    t('May'),
    t('June'),
    t('July'),
    t('August'),
    t('September'),
    t('October'),
    t('November'),
    t('December'),
  );
}

mymodule_calendar_translations()호출하거나 값을 반환 할 필요가 없습니다. 모듈의 코드가 구문 분석 t()될 때에 전달 된 리터럴 문자열을 찾는 코드에서 호출 이 발견됩니다 t().

Drupal 코어 모듈 중 어느 것도 그렇게하지 않기 때문에 데이터베이스 테이블과 해당 필드에 대한 설명을 번역하는 것은 당신이해야 할 일이 아닙니다. 예를 들어 node_schema () 에는 다음 코드가 포함되어 있습니다.

function node_schema() {
  $schema['node'] = array(
    'description' => 'The base table for nodes.', 
    'fields' => array(
      'nid' => array(
        'description' => 'The primary identifier for a node.', 
        'type' => 'serial', 
        'unsigned' => TRUE, 
        'not null' => TRUE,
      ), 
      'vid' => array(
        'description' => 'The current {node_revision}.vid version identifier.', 
        'type' => 'int', 
        'unsigned' => TRUE, 
        'not null' => TRUE, 
        'default' => 0,
      ), 
      // …
    );
    // …
  );

  // …

  return $schema;
}

에 호출의 제거를 발생 보고서 t()의 드루팔 코어 구현에서이 hook_schema()입니다 모든 스키마 설명에서 제거 t () 에 의해 개방하고있다, webchick (드루팔 7 공동 메인테이너).

Szeged에서는 t()스키마 설명과 관련하여 긴 토론이 있었으며 테이블에있는 모든 사람 (건조 포함)의 의견 t()은이 설명에서 제거되어야했습니다. 그들은 t()초기에 사용할 수 없었기 때문에 문제를 일으켰고 사람들은 기술 설명을 번역하는 데 시간을 할애 할 사람이 아무도 없다고 토론했으며 코드 주석도 번역하지 않기 때문에 실제로 의미가 없습니다. 예.

Drupal 6 모듈을 Drupal 7로 변환하는 기사에는 전용 단락이 있습니다. 스키마 설명이 더 이상 번역되지 않습니다 .


2
설치 / 업데이트 후크에서 t () 사용에 대한 자세한 정보 : drupal.org/node/322731
AyeshK

2

그것들은 변하지 않는 문자열이므로을 통과하는 것이 좋습니다 t(). 이와 같은 것들에 대한 t () 시스템의 일부 점검이 있지만 D8에서 일어날 지 확실하지 않습니다.

현재 번역에 너무 많은 문자열을 생성하므로 값을 취할 수 t($count . ' books')있는 곳 과 같은 것을 전달하면 나빠집니다 $count.


-1

그러나 변수 주위에 t ()를 사용하고 작동하는 것이 가능합니다. page.tpl.php에서 $ title로 완료했습니다.

편집 : 아마도 문자열이 번역되지는 않지만 문자열 재정의에 사용될 수 있습니다.


1
그것이 나쁜 생각 인 이유는 kiamlaluno의 답변을 참조하십시오.
Andy

kiamlaluno의 대답은 문자열이 번역되지 않는다고 말하는 것 같습니다. 그러나 t ()의 또 다른 용도는 문자열 재정의를 활성화하는 것입니다. 변수에서 작동한다는 것을 확인할 수 있습니다.
naomi

1
@naomi 예, 작동합니다. 그러나 번역을 활성화하면 t ()를 통해 전달 된 모든 제목이 번역 문자열 목록에 표시됩니다. 노드 제목 IMO를 변경하기 위해 문자열 재정의를 사용해서는 안됩니다. 필드를 작성하고 hook_preprocess_node 또는 페이지에서 노드 제목을 필드 값으로 변경하십시오. (hook_node_load 또는 관련 후크도 사용할 수 있습니다)
AyeshK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.