ฉันจะรับสตริงที่แปลเป็น Drupal.locale.strings ได้อย่างไร


9

ดังนั้นฉันจึงพยายามใช้ฟังก์ชัน Drupal.t () ในโค้ด Javascript ที่กำหนดเองของฉัน (ในธีมของฉัน)

ฉันจะรับสตริงที่ฉันต้องการเติมในวัตถุ Drupal.locale.strings ได้อย่างไร ฉันเห็นสตริงในนั้น แต่แน่นอนไม่สามารถโหลดฐานข้อมูลทั้งหมดได้ วิธีเพิ่มที่ดีที่สุดคืออะไร ฉันต้องการใช้ฟังก์ชัน PHP t () เพื่อให้สามารถเพิ่มสตริงที่สามารถแก้ไขได้ในอินเทอร์เฟซการแปล

คำตอบ:


8

Drupal จัดการการเติมสตริงที่ต้องการลงในวัตถุ javascript เช่นเดียวกับคอลเลกชันทั้งหมดของสตริงที่ไม่ได้โหลดในทุกหน้าเฉพาะสตริงที่จำเป็นเท่านั้นที่ถูกเพิ่มไปยัง JavaScript

ฉันเชื่อว่าสิ่งนี้ทำได้โดยการข้ามไฟล์สคริปต์ก่อนที่จะเพิ่มไปยังหน้าจริง

ดังนั้นหากคุณเพิ่มDrupal.t('Some string');รหัส JavaScript ของคุณคุณควรจะสามารถแปลสิ่งนั้นได้ในส่วนต่อประสานการแปล


ถ้าอย่างนั้นมันจะไม่เกิดขึ้น (การแวะเวียนของสคริปต์เพื่อค้นหาการเรียกใช้ Drupal.t () ฉันเพิ่มสคริปต์ผ่านไฟล์. info ของชุดรูปแบบ (สคริปต์ [] = สคริปต์ / script.js) บางทีฉันต้องเพิ่มผ่าน drupal_add_js ()?
JonMcL

คุณถูก. ฉันต้องติดตามเพื่อให้เข้าใจอย่างถ่องแท้ แต่มันเกิดขึ้นโดยอัตโนมัติอย่างแน่นอน ใน Drupal 7 ฟังก์ชันคือ locale_js_alter () (ใน locale.module) มันใช้รายการทั้งหมดของไฟล์ Javascript และแยกแต่ละไฟล์ใน _locale_parse_js_file () ระวังเพื่อให้แน่ใจว่า file_get_contents () สามารถโหลดไฟล์ JS ของคุณด้วยพา ธ ที่ให้ไว้ (เช่นอย่าเริ่มต้นพา ธ ของคุณด้วย / หากไฟล์นั้นอยู่ในโฟลเดอร์ธีมของคุณ) คุณสามารถใช้ drupal_add_js หรือการตั้งค่าสคริปต์ [] ในไฟล์. info ของธีมของคุณ แน่นอนให้แน่ใจว่าได้ล้างแคชและแปลสตริง! :)
JonMcL

6

เพิ่งพบปัญหาเดียวกันนี้วันนี้และค้นคว้าเพิ่มเติมอีกเล็กน้อย Chris ด้านบนมีความคิดเห็นดี แต่ในที่สุดก็ไม่ถูกต้อง คุณไม่จำเป็นต้องใช้ Drupal.behaviors เพื่อให้มันทำงานได้

ตามที่ระบุไว้โดย JonMcL ตัวเองในความคิดเห็นล่าสุดของเขาฟังก์ชั่น _locale_parse_js_file ใน locale.inc เป็นผู้รับผิดชอบในการแยกรูปแบบของ Drupal.t ("somestring") รูปแบบเริ่มต้นจากแถว 1493 (ใน 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);

เป็นเพียงฟังก์ชันการแยกวิเคราะห์ "โง่" ที่ไม่สนใจความหมายและเพียงค้นหาอินสแตนซ์ทั้งหมดของ Drupal.t ("บางอย่าง") ในไฟล์ใด ๆ ก็ตามที่ได้รับ

สิ่งที่อาจเป็น gotcha ทั่วไปก็คือคุณต้องมีทั้งสตริงในซอร์สโค้ดของคุณในรูปแบบ Drupal.t ("translateme") เพราะ (เห็นได้ชัดว่า) ไม่มีจาวาสคริปต์ที่จะดำเนินการเมื่อเปิดไฟล์ผ่าน file_get_contents ใน php นั่นหมายความว่าคุณจะไม่สามารถทำ Drupal.t (somevariable) และหวังว่า Drupal จะตรวจจับตัวแปรจาวาสคริปต์ที่มีสตริงทั้งหมดที่คุณส่งมาที่ Drupal.t

หากคุณต้องการแปล "women" สำหรับแผนภูมิและให้บริบทเป็นสตริงไวยากรณ์จะเป็น:

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

นอกจากนี้หากคุณติดตั้ง drush แล้วให้ตรวจสอบไฟล์ js ของคุณแยกวิเคราะห์ด้วยคำสั่ง;

drush vget javascript_parsed

จากนั้นคุณสามารถล้างแคชด้วย

drush cc all

... และทำซ้ำคำสั่ง vget ด้านบนเพื่อตรวจสอบรายชื่อไฟล์ที่แจงแล้วว่างเปล่า วิธีนี้ไฟล์ของคุณจะถูกวิเคราะห์ใหม่ในครั้งถัดไป (ตรวจสอบด้วย)


1
ขอบคุณสำหรับdrush vget javascript_parsed! วิธีที่รวดเร็วในการบังคับให้สร้างไฟล์แปลสคริปต์โดยเพียงแค่การลบไฟล์ CSS และ JS drush @sitealias cc css-jsใช้
lmeurs

0

gotchas คู่ฉันเจอเมื่อใช้ JS หลายภาษาใน Drupal 7:

  1. ก่อนให้แน่ใจว่าไฟล์ JS ของคุณจะไม่ถูกรวมอยู่ในบรรทัด ในฐานะของ Drupal 7.22, Drupal.locale.stringsดูเหมือนจะไม่ปรับปรุงตัวเองโดยอัตโนมัติหากคุณกำลังinlining ไฟล์ JavaScript ใน Drupal อินเทอร์เฟซการแปลยังคงรับสายอยู่เพิ่มความสับสนของฉัน

  2. ขั้นที่สองตรวจสอบให้แน่ใจว่าคุณใช้Drupal.behaviorsเพื่อแนบ JS ของคุณเข้ากับหน้า ปกติปิด JS จะไม่เรียก "วิเศษ" ของ Drupal แยกของDrupal.t()สวด นี่คือเทคนิคสิ่งที่คุณควรจะทำ;)

จากตรงนั้นมันช่างเจ็บปวดจริงๆ เพียงแค่ใช้รอบข้อความที่คุณต้องการแปลล้างแคชของคุณในแต่ละครั้งที่คุณปรับปรุงแฟ้มและนักแปลของคุณควรดูสตริงใหม่ในอินเตอร์เฟซที่Drupal.t() /admin/config/regional/translate/translateมันค่อนข้างดีเมื่อคุณทำให้มันทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.