Điểm:0

Vì vậy object.field_supplier_products trả về "product1"

lá cờ us
jfc

Tạo "danh sách đen thẻ" cho người dùng trên chế độ xem

Tôi đang sử dụng API REST trong Drupal 9 và đang sử dụng các ký tự mẫu JavaScript để tạo một số dữ liệu.

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

Ví dụ: để tạo danh sách các sản phẩm được lấy từ API, đây là mã của tôi -

Điều này trả về những gì tôi có trong field_supplier_products, ví dụ: "Sản phẩm 1, Sản phẩm 1, Sản phẩm 3", nhưng tôi không thể tìm thấy bản dịch chuỗi.

Đây là một trang web đa ngôn ngữ và những tên sản phẩm này cần được dịch.

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

Nếu tôi làm -

Sau đó, tôi thấy tên sản phẩm trong bản dịch chuỗi

Có cách nào khả thi hoặc giải quyết xung quanh để có thể sử dụng Drupal.t với các biến không?

*Chỉnh sửa - một ví dụ bên ngoài API -

Drupal.t("cái gì đó cần dịch")

Tôi có thể tìm thấy chuỗi "thứ cần dịch"

translateVariable = 'bản dịch trong biến'

Drupal.t(dịchBiến)

Không có kết quả nào cho "dịch theo biến" khi tôi tìm kiếm chuỗi

*Chỉnh sửa 2 -

Một số ngữ cảnh khác - Tôi đang sử dụng Mô-đun dịch vụ web RESTful của Drupal để có API REST cho chế độ xem. Tôi đã tạo một chế độ xem có tất cả các sản phẩm của mình.

Tôi có một tệp JavaScript product.js được sử dụng để tạo đánh dấu trên tệp products.html.twig của tôi. Trong tệp đó có mã này -
(hàm ($, Drupal) {
    nếu ( document.querySelector('#products-page') ) {
        $.ajax({
            phương thức: 'NHẬN',
            url: '/api/products/'
        }).done(hàm (dữ liệu, trạng thái, xhr) {
            $.each(data, function (index, object) {
                $('#products .wrapper').append(`
                <div class="col-12 product">
                    <span class="products">${Drupal.t(object.field_supplier_products)}</span>
                </div>
                
                `)
            });
        });
    }
})

Một ví dụ về một số json được trả về từ đối tượng -

    {
        "title": "Nhà cung cấp 1",
        "không": "1",
        "market_id": "2",
        "product_id": "15",
        "field_supplier_products": sản phẩm1,
    },

Kevin avatar
lá cờ in
Bạn đang làm điều này trên một trang web không phải là Drupal? API cần chuyển bản dịch trong phản hồi của nó.
jfc avatar
lá cờ us
jfc
Trang web là Drupal, tôi chỉ đang sử dụng Drupal REST API để tạo đánh dấu của mình thay vì chế độ xem
Jaypan avatar
lá cờ de
Vì vậy, bạn đang sử dụng tập lệnh JS trong Drupal, để thực hiện lệnh gọi API REST tới cùng một phiên bản Drupal (hay còn gọi là chính nó)? Lệnh gọi tới `Drupal.t()` trong tệp JS có thực hiện lệnh gọi tới API không? Hơi khó sắp xếp kiến ​​trúc của bạn để đưa ra câu trả lời thích hợp, vì vậy nếu bạn có thể giải thích về kiến ​​trúc và vị trí lệnh gọi `Drupal.t()`, thì việc cung cấp hỗ trợ sẽ dễ dàng hơn.
jfc avatar
lá cờ us
jfc
Tôi đã chỉnh sửa bài đăng của mình với một số chi tiết hơn @Jaypan
Jaypan avatar
lá cờ de
Tôi vẫn chưa hiểu kiến ​​trúc của bạn, nhưng tôi nghĩ tôi có thể thấy vấn đề ngay bây giờ và sẽ thêm giải pháp bên dưới.
Điểm:0
lá cờ de

Vấn đề là do bạn đang cố dịch một biến, thay vì một chuỗi ký tự:

Drupal.t(object.field_supplier_products)

Trong Drupal, các biến không nên được dịch, vì cả lý do bảo mật và để giữ cho bảng dịch sạch sẽ. Bây giờ, về phía máy chủ trong PHP nếu bạn sử dụng t() chức năng xung quanh một biến, ví dụ t($màu) nó sẽ đưa ra một cảnh báo, nhưng giá trị vẫn có thể dịch được (tôi đã không thử/kiểm tra trong một vài năm). Nhưng nếu tôi nhớ không nhầm thì với JS và Drupal.t() chức năng, không thể dịch các biến nào cả. Điều này là do tập lệnh Drupal thực sự được Drupal phân tích cú pháp cho các giá trị và được tạo lại với các giá trị đã dịch, được lưu vào bộ nhớ cache với các giá trị đã dịch và tệp mới này được gửi tới trình duyệt. Vì vậy, không có bản dịch nào thực sự xảy ra trên trình duyệt, bản dịch thực sự được thực hiện bởi PHP trên máy chủ và một tệp mới được tạo trước khi gửi tệp tới trình duyệt.

Giải pháp là đảm bảo rằng các giá trị của bạn được dịch trong API REST để chúng đã được dịch khi JS của bạn nhận được chúng và sẽ không yêu cầu sử dụng Drupal.t() chức năng. Từ bài đăng của bạn, có vẻ như điểm cuối REST cũng là một phiên bản Drupal, vì vậy để thực hiện việc này trên máy chủ REST, bạn sẽ:

  1. Thiết lập máy chủ API REST để trở thành một trang web đa ngôn ngữ, với tính năng phát hiện ngôn ngữ bằng URL.
  2. Đưa ra yêu cầu của bạn tới API bằng cách sử dụng URL đa ngôn ngữ cho ngôn ngữ sẽ được truy xuất.

Ví dụ: nếu trang web đa ngôn ngữ của bạn khác nhau theo tiền tố đường dẫn, bạn sẽ có:

  • http://www.example.com/path/to/restserver [ngôn ngữ chính]
  • http://www.example.com/[LANGUAGE_PREFIX]/path/to/restserver (LANGUAGE_PREFIX ngôn ngữ)

Sau đó, JS của bạn sẽ yêu cầu API REST từ đường dẫn ngôn ngữ có liên quan.

Tôi thường thấy việc tạo URL ở phía máy chủ sẽ có lợi và chuyển URL được tạo bằng PHP này, URL này sẽ chứa tiền tố ngôn ngữ cho ngôn ngữ hiện tại, tới JS, sau đó gọi URL động.

Điều này được thực hiện đầu tiên bằng cách tạo một thư viện có thêm tệp JS của bạn và phụ thuộc vào cài đặt Drupal:

ví dụ_library:
  js:
    đường dẫn/đến/file.js: {}
  phụ thuộc:
    - lõi/drupalSettings

Sau đó, phần tử kết xuất của bạn sẽ đính kèm thư viện và chuyển URL tới tệp JS trong thư viện:

sử dụng Drupal\Core\Url;
$trang[
  'một số_phần tử' => [
    '#prefix' => '<div id="example_placeholder">',
    '#suffix' => '</div>',
    '#markup' => $this->t('Giữ chỗ'),
    '#đính kèm' => [
      'thư viện' => ['[MODULE]/example_library'],
      'drupalSettings' => [
        'ví dụMô-đun' => [
          'ajaxCallbackUrl' => Url::fromRoute('[RESTAPI ROUTE]', [], ['absolute' => TRUE])->toString(),
        ],
      ],
    ],
  ],
];

Bây giờ, kịch bản tập tin.js sẽ có quyền truy cập vào URL API REST với tiền tố ngôn ngữ, trong drupalSettings.exampleModule.ajaxCallbackUrl Biến đổi.

tệp.js:

chức năng (drupalSettings) {

  hàm doS Something () {
    console.log(drupalSettings.exampleModule.ajaxCallbackUrl);
  }
}(drupalSettings));

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.