Làm cách nào để có được chuỗi dịch sang Drupal.locale.strings?


9

Vì vậy, tôi đang cố gắng sử dụng hàm Drupal.t () trong một số mã Javascript tùy chỉnh của mình (trong chủ đề của tôi).

Làm cách nào để có được chuỗi tôi cần trong đối tượng Drupal.locale.strings? Tôi thấy một số chuỗi trong đó, nhưng tất nhiên toàn bộ cơ sở dữ liệu không thể được tải. Cách tốt nhất để thêm vào nó là gì? Tôi muốn sử dụng hàm t () của PHP để các chuỗi được thêm vào có thể được chỉnh sửa trong giao diện Dịch.

Câu trả lời:


8

Drupal xử lý các chuỗi cần thiết vào đối tượng javascript. Giống như toàn bộ bộ sưu tập chuỗi không được tải trên mỗi trang, chỉ có các chuỗi cần thiết được thêm vào JavaScript.

Tôi tin rằng điều này được thực hiện bằng cách duyệt qua các tệp script trước khi chúng thực sự được thêm vào trang.

Vì vậy, nếu bạn thêm Drupal.t('Some string');vào mã JavaScript của mình, bạn sẽ có thể dịch mã đó trong giao diện dịch.


Vậy thì điều đó không xảy ra. (truyền tải tập lệnh để tìm các lệnh gọi Drupal.t ()). Tôi đang thêm tập lệnh thông qua tệp .info của chủ đề (scripts [] = scripts / script.js). Có lẽ tôi phải thêm thông qua drupal_add_js ()?
JonMcL

Bạn nói đúng. Tôi đã phải theo dõi để có được sự hiểu biết đầy đủ, nhưng nó thực sự xảy ra tự động. Trong Drupal 7, hàm là locale_js_alter () (trong locale.module). Nó sử dụng danh sách đầy đủ các tệp Javascript và phân tích từng tệp trong _locale_parse_js_file (). Hãy cẩn thận để đảm bảo rằng file_get_contents () có thể tải tệp JS của bạn với đường dẫn được cung cấp (nghĩa là không bắt đầu đường dẫn của bạn bằng / nếu nó trong thư mục chủ đề của bạn). Bạn có thể sử dụng drupal_add_js hoặc cài đặt tập lệnh [] trong tệp .info của chủ đề. Tất nhiên, đảm bảo xóa bộ nhớ cache và dịch chuỗi! :)
JonMcL

6

Chỉ cần gặp vấn đề tương tự ngày hôm nay và nghiên cứu thêm một chút. Chris ở trên có một nhận xét tốt, nhưng cuối cùng nó không chính xác. Bạn không cần sử dụng Drupal.behaviors để nó hoạt động.

Như chính JonMcL đã lưu ý trong bình luận cuối cùng của mình, hàm _locale_parse_js_file trong locale.inc chịu trách nhiệm phân tích các mẫu Drupal.t ("somestring") bắt đầu từ hàng 1493 (trong Drupal 7.22):

preg_match_all('~
[^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
\(\s*                                         # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s*                 # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
  (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)?                                           # close optional args
[,\)]                                         # match ")" or "," to finish
~sx', $file, $t_matches);

Đây chỉ là một chức năng phân tích cú pháp "ngu ngốc" không quan tâm đến ngữ nghĩa và chỉ đơn giản là tìm thấy tất cả các phiên bản của Drupal.t ("một cái gì đó") trong bất kỳ tệp nào mà nó nhận được.

Điều có thể là một vấn đề phổ biến là bạn cần phải có toàn bộ chuỗi trong mã nguồn của mình ở dạng Drupal.t ("translHRe"), bởi vì (rõ ràng) không có javascript nào được thực thi khi tệp được mở thông qua file_get_contents trong php. Điều đó có nghĩa là bạn không bao giờ có thể làm Drupal.t (somevariable) và hy vọng Drupal sẽ nắm bắt tất cả các biến javascript chứa chuỗi mà bạn ném vào Drupal.t.

Nếu bạn muốn dịch "phụ nữ" cho biểu đồ và đặt chuỗi ngữ cảnh, cú pháp sẽ là:

Drupal.t("women", {}, {context: "charts"}

Ngoài ra, nếu bạn đã cài đặt drush, hãy xác minh tệp js của bạn được phân tích cú pháp bằng lệnh;

drush vget javascript_parsed

Sau đó, bạn có thể làm sạch bộ nhớ cache của bạn với

drush cc all

... và lặp lại lệnh vget ở trên để xác minh danh sách các tệp đã được phân tích cú pháp trống. Bằng cách này, tệp của bạn sẽ được sửa lại lần chạy tiếp theo (xác minh điều đó).


1
Cảm ơn vì drush vget javascript_parsed! Một cách nhanh hơn để buộc xây dựng lại các tệp tập lệnh dịch bằng cách xóa các tệp CSS và JS bằng cách sử dụng drush @sitealias cc css-js.
lmeurs

0

Cặp đôi gotchas tôi đã gặp trong khi triển khai JS đa ngôn ngữ trong Drupal 7:

  1. Trước tiên, hãy đảm bảo tệp JS của bạn không được đưa vào nội tuyến . Kể từ Drupal 7.22, Drupal.locale.stringsdường như không tự động cập nhật nếu bạn đang đặt các tệp JavaScript trong Drupal . Giao diện dịch vẫn tiếp tục chọn chuỗi, làm tôi thêm bối rối.

  2. Thứ hai, đảm bảo bạn đang sử dụng Drupal.behaviors để đính kèm JS của bạn vào trang. Việc đóng cửa JS thông thường sẽ không kích hoạt phân tích cú pháp "ma thuật" của Drupal Drupal.t(). Đây là kỹ thuật mà bạn nên làm bằng mọi cách;)

Từ đó nó thực sự là không đau. Chỉ cần sử dụng Drupal.t()xung quanh văn bản bạn muốn dịch, xóa bộ nhớ cache của bạn mỗi khi bạn cập nhật tệp và người dịch của bạn sẽ thấy chuỗi mới trong giao diện tại /admin/config/regional/translate/translate. Nó khá tốt khi bạn làm cho nó hoạt động.

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.