it-swarm-vi.com

Có phải luôn luôn xấu khi truyền một biến qua t ()?

Tôi có một hàm trợ giúp nhỏ cho hook_schema của mình:

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),
  );
}

Và sau đó tôi có thể sử dụng nó như:

/**
 * 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ôi biết rằng hướng dẫn không phải là chuyển các biến qua t() nhưng điều này có vẻ rất giống với cách hệ thống menu chuyển tiêu đề của cuộc gọi lại thông qua t() (theo mặc định). Bất kỳ ý kiến ​​về điều này là phong cách tốt hay xấu?

13
Andy

Đối số đầu tiên của t() cần phải là một chuỗi ký tự, loại trừ:

  • các biến, thậm chí các tham số của hàm: t($description)
  • nối chuỗi: t('If you want to add a link, click on' . '<a href="http://example.com">this link</a>.')
  • giá trị được trả về từ một hàm: t(get_menu_description())
  • một hằng số: t(MYMODULE_MY_WIDGET_TITLE), t(MyClass::WIDGET_TITLE)

Lý do là, ngoài một số hook cụ thể (ví dụ hook_menu(), hook_perm(), hook_permission()), chuỗi cần dịch được tìm thấy từ một tập lệnh quét mã của một mô-đun, tìm kiếm mã như t('This is an example.'); khi nó tìm thấy một giá trị phụ thuộc vào thời gian chạy, chẳng hạn như giá trị của biến, tập lệnh không thể hiểu đó là chuỗi cần dịch, vì một biến có thể chứa một giá trị khác nhau mỗi lần mã được thực thi. Trong thực tế, http://localize.drupal.org báo cáo một cảnh báo tương tự như cảnh báo sau, trong trường hợp đối số cho t() không phải là một chuỗi bằng chữ:

Tham số đầu tiên cho t() phải là một chuỗi ký tự. Không nên có biến, nối, hằng hoặc các chuỗi không theo nghĩa đen khác ở đó. Tại t($filter['name']) trong customfilter/customfilter.module trên dòng 30.

Nếu bạn chuyển một giá trị động cho t(), tập lệnh trích xuất các chuỗi cần dịch sẽ không trích xuất bất kỳ giá trị nào, trong trường hợp đó; hiệu ứng là đối số được truyền cho t() sẽ không được dịch, có tác dụng tương tự là không sử dụng t() và sử dụng đầu ra động trực tiếp trong giao diện người dùng. Trường hợp duy nhất mà chuỗi sẽ được dịch là khi chuỗi động bằng chuỗi ký tự mà một hàm truyền đến t(). Ví dụ, giả sử rằng bạn có một thư viện không nghĩ đến Drupal, trong đó có một hàm trả về tên của tháng hiện tại. Với đoạn mã sau, giá trị được trả về từ hàm đó sẽ được dịch.

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() không cần phải gọi, cũng không trả về bất kỳ giá trị nào. Khi mã của mô-đun sẽ được phân tích cú pháp, lệnh gọi tới t() sẽ được tìm thấy từ mã tìm chuỗi ký tự được truyền cho t().

Dịch mô tả được cung cấp cho bảng cơ sở dữ liệu và các trường của nó không phải là điều bạn nên làm, vì không có mô đun lõi nào Drupal làm điều đó; ví dụ: node_schema () chứa mã sau:

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;
}

Báo cáo gây ra việc loại bỏ các cuộc gọi đến t() từ bất kỳ Drupal triển khai cốt lõi của hook_schema()Remove t() từ tất cả các mô tả lược đồ , đã được mở bởi webchick (đồng bảo trì Drupal 7).

Ở Szeged, chúng tôi đã có một cuộc thảo luận dài về t() xung quanh các mô tả lược đồ và đó là sự đồng thuận của tất cả mọi người trong bàn (bao gồm cả Dries) rằng t() s nên bị xóa khỏi các mô tả này . Họ làm mọi thứ rối tung lên vì t() không có sẵn sớm như vậy và mọi người đã thảo luận rằng sẽ không có ai dành thời gian để dịch các mô tả kỹ thuật của công cụ, và nó không thực sự có ý nghĩa vì chúng tôi cũng không 't dịch mã bình luận, ví dụ.

Bài viết về chuyển đổi mô đun a Drupal 6 thành Drupal 7, có một đoạn dành riêng: Mô tả lược đồ không còn được dịch .

17
kiamlaluno

Chúng là các chuỗi bất biến, vì vậy thật tốt khi truyền chúng qua t(). Có một số đại tu của hệ thống t() cho những thứ như thế này, nhưng tôi không chắc nó sẽ xảy ra trong D8.

Hiện tại, nó chỉ xấu nếu bạn vượt qua một cái gì đó như t($count . ' books') trong đó $count có thể nhận bất kỳ giá trị nào, vì nó sẽ tạo ra quá nhiều chuỗi cho bản dịch.

2
jcisio