Đố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()
là 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 .