Score:0

ดังนั้น object.field_supplier_products จึงส่งคืน "product1"

ธง us
jfc

การสร้าง "แท็กบัญชีดำ" สำหรับผู้ใช้ในมุมมอง

ฉันใช้ REST API ใน Drupal 9 และใช้เทมเพลต JavaScript ตามตัวอักษรเพื่อสร้างข้อมูลบางส่วน

<span class="products">${Drupal.t(object.field_supplier_products)}</span>

ตัวอย่างเช่น หากต้องการสร้างรายการผลิตภัณฑ์ที่ดึงมาจาก API นี่คือรหัสของฉัน -

สิ่งนี้ส่งคืนสิ่งที่ฉันมีภายใต้ field_supplier_products เช่น "ผลิตภัณฑ์ 1, ผลิตภัณฑ์ 1, ผลิตภัณฑ์ 3" แต่ฉันไม่พบการแปลสตริง

นี่เป็นไซต์หลายภาษาและจำเป็นต้องแปลชื่อผลิตภัณฑ์เหล่านี้

<span class="products">${Drupal.t('Product One')}</span>
<span class="products">${Drupal.t('Product Two')}</span>
<span class="products">${Drupal.t('Product Three')}</span>

ถ้าฉันทำ -

จากนั้นฉันเห็นชื่อผลิตภัณฑ์ในการแปลสตริง

มีวิธีใดที่เป็นไปได้หรือวิธีแก้ไขเพื่อให้สามารถใช้ Drupal.t กับตัวแปรได้หรือไม่?

* แก้ไข - ตัวอย่างนอก API -

Drupal.t("บางสิ่งที่จะแปล")

ฉันสามารถค้นหาสตริง "บางสิ่งที่จะแปล"

translateVariable = 'การแปลในตัวแปร'

Drupal.t (แปลตัวแปร)

ไม่มีผลลัพธ์สำหรับ "การแปลในตัวแปร" เมื่อฉันค้นหาสตริง

* แก้ไข 2 -

บริบทเพิ่มเติม - ฉันใช้ Drupal RESTful Web Services Module เพื่อให้มี REST API สำหรับมุมมอง ฉันสร้างมุมมองที่มีผลิตภัณฑ์ทั้งหมดของฉัน

ฉันมีไฟล์ JavaScript product.js ที่ใช้สร้างมาร์กอัปในไฟล์ products.html.twig ของฉัน ในไฟล์นั้นมีรหัสนี้ -
(ฟังก์ชัน ($, Drupal) {
    ถ้า ( document.querySelector('#products-page') ) {
        $.ajax({
            วิธีการ: 'รับ',
            url: '/api/ผลิตภัณฑ์/'
        }).done(ฟังก์ชัน (ข้อมูล, สถานะ, xhr) {
            $.each(ข้อมูล ฟังก์ชัน (ดัชนี วัตถุ) {
                $('#products .wrapper').ต่อท้าย(`
                <div class="ผลิตภัณฑ์ col-12">
                    <span class="products">${Drupal.t(object.field_supplier_products)}</span>
                </div>
                
                `)
            });
        });
    }
})

ตัวอย่างของ json บางส่วนที่ส่งคืนจากวัตถุ -

    {
        "หัวข้อ": "ซัพพลายเออร์ 1",
        "นิด": "1",
        "market_id": "2",
        "product_id": "15",
        "field_supplier_products": ผลิตภัณฑ์1,
    },

Kevin avatar
in flag
คุณกำลังทำสิ่งนี้บนไซต์ที่ไม่ใช่ Drupal ใช่ไหม API ต้องผ่านการแปลในการตอบสนอง
jfc avatar
us flag
jfc
ไซต์นี้คือ Drupal ฉันแค่ใช้ Drupal REST API เพื่อสร้างมาร์กอัปแทนมุมมอง
Jaypan avatar
de flag
ดังนั้นคุณจึงใช้สคริปต์ JS ใน Drupal เพื่อทำการเรียก REST API ไปยังอินสแตนซ์ Drupal เดียวกัน (หรือที่เรียกว่าตัวมันเอง) การเรียก `Drupal.t()` ในไฟล์ JS เป็นการเรียก API หรือไม่ เป็นเรื่องยากเล็กน้อยที่จะแยกแยะสถาปัตยกรรมของคุณเพื่อให้ตอบกลับได้อย่างถูกต้อง ดังนั้นหากคุณสามารถอธิบายสถาปัตยกรรมและตำแหน่งของการเรียก `Drupal.t()` ได้ การให้ความช่วยเหลือก็จะง่ายขึ้น
jfc avatar
us flag
jfc
ฉันแก้ไขโพสต์ของฉันพร้อมรายละเอียดเพิ่มเติม @Jaypan
Jaypan avatar
de flag
ฉันยังไม่เข้าใจสถาปัตยกรรมของคุณ แต่ฉันคิดว่าฉันเห็นปัญหาแล้ว และจะเพิ่มวิธีแก้ปัญหาด้านล่าง
Score:0
ธง de

ปัญหาเกิดจากการที่คุณพยายามแปลตัวแปรแทนที่จะเป็นสตริงตามตัวอักษร:

Drupal.t(object.field_supplier_products)

ใน Drupal ไม่ควรแปลตัวแปรด้วยเหตุผลด้านความปลอดภัย และเพื่อให้ตารางการแปลสะอาด ตอนนี้ที่ฝั่งเซิร์ฟเวอร์ใน PHP หากคุณต้องใช้ไฟล์ เสื้อ() ฟังก์ชันรอบตัวแปร เช่น เสื้อ($สี) มันจะส่งคำเตือน แต่ค่าควรยังสามารถแปลได้ (ฉันไม่ได้ลอง / ตรวจสอบมาสองสามปีแล้ว) แต่ถ้าจำไม่ผิด JS กับ the Drupal.t() ฟังก์ชั่นแปลตัวแปรไม่ได้เลย นี่เป็นเพราะสคริปต์ Drupal แยกวิเคราะห์ค่าโดย Drupal และสร้างใหม่ด้วยค่าที่แปลแล้ว แคชด้วยค่าที่แปลแล้ว และไฟล์ใหม่นี้จะถูกส่งไปยังเบราว์เซอร์ ดังนั้นจึงไม่มีการแปลเกิดขึ้นบนเบราว์เซอร์ จริง ๆ แล้วการแปลนั้นถูกบังคับใช้โดย PHP บนเซิร์ฟเวอร์ และไฟล์ใหม่จะถูกสร้างขึ้นก่อนที่จะส่งไฟล์ไปยังเบราว์เซอร์

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

  1. ตั้งค่าเซิร์ฟเวอร์ REST API ให้เป็นไซต์หลายภาษา พร้อมการตรวจจับภาษาด้วย URL
  2. ส่งคำขอของคุณไปยัง API โดยใช้ URL หลายภาษาสำหรับภาษาที่จะดึงข้อมูล

ตัวอย่างเช่น หากไซต์หลายภาษาของคุณแตกต่างกันไปตามคำนำหน้าเส้นทาง คุณจะมี:

  • http://www.example.com/path/to/restserver [ภาษาหลัก]
  • http://www.example.com/[LANGUAGE_PREFIX]/path/to/restserver (ภาษาLANGUAGE_PREFIX)

จากนั้น JS ของคุณจะขอ REST API จากเส้นทางภาษาที่เกี่ยวข้อง

ฉันมักจะพบว่าการสร้าง URL ทางฝั่งเซิร์ฟเวอร์มีประโยชน์ และส่ง URL ที่สร้างโดย PHP นี้ ซึ่งจะมีคำนำหน้าภาษาสำหรับภาษาปัจจุบัน ไปยัง JS ซึ่งจะเรียก URL แบบไดนามิก

ขั้นตอนแรกทำได้โดยการสร้างไลบรารีที่เพิ่มไฟล์ JS ของคุณ และมีการพึ่งพาการตั้งค่า Drupal:

example_library:
  จส:
    เส้นทาง/to/file.js: {}
  การพึ่งพา:
    - การตั้งค่าหลัก / drupal

จากนั้น องค์ประกอบการเรนเดอร์ของคุณจะแนบไลบรารี และส่ง URL ไปยังไฟล์ JS ในไลบรารี:

ใช้ Drupal\Core\Url;
$เพจ[
  'some_element' => [
    '#prefix' => '<div id="example_placeholder">',
    '#suffix' => '</div>',
    '#markup' => $this->t('ตัวยึดตำแหน่ง'),
    '#attached' => [
      'library' => ['[MODULE]/example_library'],
      'drupalSettings' => [
        'exampleModule' => [
          'ajaxCallbackUrl' => Url::fromRoute('[RESTAPI ROUTE]', [], ['absolute' => TRUE])->toString(),
        ]
      ]
    ]
  ]
];

ตอนนี้สคริปต์ ไฟล์. js จะสามารถเข้าถึง REST API URL พร้อมคำนำหน้าภาษาใน drupalSettings.exampleModule.ajaxCallbackUrl ตัวแปร.

ไฟล์. js:

ฟังก์ชัน (drupalSettings) {

  ฟังก์ชัน doSomething() {
    console.log (drupalSettings.exampleModule.ajaxCallbackUrl);
  }
}(การตั้งค่า drupal));

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา