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


14

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 t()(theo mặc định). Bất kỳ ý kiến ​​về điều này là phong cách tốt hay xấu?

Câu trả lời:


17

Đối số đầu tiên của t()nhu cầu 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 vài móc cụ thể (ví dụ như hook_menu(), hook_perm(), hook_permission()), chuỗi dịch được tìm thấy từ một kịch bản mà quét mã của một module, tì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ố t()không phải là một chuỗi bằng chữ:

Tham số đầu tiên 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 tới 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 vào 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 được gọi, cũng không trả lại 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()sẽ được tìm thấy từ mã tìm chuỗi ký tự được truyền đến t().

Dịch mô tả được cung cấp cho một 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 Drupal nào làm điều đó; ví dụ: node_schema () chứa đoạn 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ỳ triển khai lõi Drupal nào hook_schema()Loại bỏ t () khỏi 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()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) t()nên loại bỏ khỏi các mô tả này. Họ làm rối tung mọi thứ vì t()không có sẵn sớm 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 dịch các bình luận mã, cho thí dụ.

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


2
Thông tin thêm về cách sử dụng t () trong cài đặt / cập nhật hook: drupal.org/node/322731
AyeshK

2

Chúng là các chuỗi bất biến, vì vậy thật tốt khi vượt qua chúng t(). Có một số đại tu 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 chuyển một cái gì đó như t($count . ' books')nơi $countcó 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.


-1

Tuy nhiên, có thể sử dụng t () xung quanh một biến và để nó hoạt động. Tôi đã thực hiện nó với tiêu đề $ trong page.tpl.php.

EDIT: Có lẽ các chuỗi không được dịch, nhưng chúng có thể được sử dụng để ghi đè chuỗi.


1
Xem câu trả lời của kiamlaluno để biết tại sao đó là một ý tưởng tồi.
Andy

Câu trả lời của kiamlaluno dường như nói rằng chuỗi sẽ không được dịch. Nhưng một cách sử dụng khác cho t () là cho phép ghi đè chuỗi. Tôi có thể xác nhận rằng nó không hoạt động với các biến.
naomi

1
@naomi Vâng, nó sẽ hoạt động. Nhưng nếu bạn đã bật bản dịch, tất cả các tiêu đề được thông qua sẽ kết thúc trong danh sách chuỗi dịch. Bạn không nên sử dụng ghi đè chuỗi để thay đổi tiêu đề nút IMO. Tạo một trường và thay đổi tiêu đề nút thành giá trị của trường trong hook_pre process_node hoặc trang. (Bạn cũng có thể sử dụng hook_node_load hoặc bất kỳ hook nào có liên quan)
AyeshK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.