Puncte:0

Deci, object.field_supplier_products returnează „product1”

drapel us
jfc

Crearea unei „liste negre de etichete” pentru utilizatorii dintr-o vizualizare

Folosesc API-ul REST în Drupal 9 și folosesc literale șablon JavaScript pentru a genera unele dintre date.

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

De exemplu, pentru a genera o listă de produse care sunt extrase din API, acesta este codul meu -

Aceasta returnează ceea ce am sub field_supplier_products, deci, de exemplu, „Produs 1, Produs 1, Produs 3”, dar nu pot găsi traducerile șirurilor.

Acesta este un site multilingv și aceste nume de produse trebuie traduse.

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

Daca eu fac -

Apoi văd numele produselor în traducerea șirului

Există vreo modalitate sau o soluție posibilă pentru a putea folosi Drupal.t cu variabile?

*Edit - un exemplu în afara API -

Drupal.t(„ceva de tradus”)

Pot găsi șirul „ceva de tradus”.

translateVariable = „traducere în variabilă”

Drupal.t(translateVariable)

Nu există rezultate pentru „traducere în variabilă” când am căutat șirul

*Editare 2 -

Mai mult context - folosesc modulul Drupal RESTful Web Services pentru a avea un API REST pentru o vizualizare. Am creat o vizualizare care conține toate produsele mele.

Am un fișier JavaScript product.js care este folosit pentru a genera markup pe fișierul meu products.html.twig. În acel fișier există acest cod -
(funcție ($, Drupal) {
    dacă ( document.querySelector('#products-page') ) {
        $.ajax({
            metoda: „GET”,
            url: „/api/products/”
        }).done(funcție (date, stare, xhr) {
            $.each(date, funcție (index, obiect) {
                $('#produse .wrapper').append(`
                <div class="col-12 product">
                    <span class="products">${Drupal.t(object.field_supplier_products)}</span>
                </div>
                
                `)
            });
        });
    }
})

Un exemplu de unele dintre json returnate de la obiect -

    {
        "title": "Furnizor 1",
        "nid": "1",
        "market_id": "2",
        "product_id": "15",
        „field_supplier_products”: produs1,
    },

Kevin avatar
drapel in
Faci asta pe un site care nu este Drupal? API-ul trebuie să treacă traducerea în răspunsul său.
jfc avatar
drapel us
jfc
Site-ul este Drupal, folosesc doar API-ul REST Drupal pentru a-mi genera marcajul în loc de o vizualizare
Jaypan avatar
drapel de
Deci, utilizați un script JS în Drupal, pentru a efectua un apel API REST către aceeași instanță Drupal (alias însuși)? Apelul către „Drupal.t()” din fișierul JS face apelul către API? Este puțin dificil să vă sortați arhitectura pentru a oferi un răspuns adecvat, așa că dacă ați putea explica arhitectura și unde se află apelul la `Drupal.t()`, ar fi mai ușor să oferiți asistență.
jfc avatar
drapel us
jfc
Mi-am editat postarea cu mai multe detalii @Jaypan
Jaypan avatar
drapel de
Încă nu înțeleg arhitectura ta, dar cred că pot vedea problema acum și voi adăuga o soluție mai jos.
Puncte:0
drapel de

Problema se datorează faptului că încercați să traduceți o variabilă, mai degrabă decât un șir literal:

Drupal.t(object.field_supplier_products)

În Drupal, variabilele nu trebuie traduse, atât din motive de securitate, cât și pentru a menține curat tabelul de traduceri. Acum, pe partea de server în PHP, dacă ar fi să utilizați t() funcția în jurul unei variabile, de exemplu t($culoare) ar arunca un avertisment, dar valoarea ar trebui să fie în continuare traducabilă (nu am încercat/verificat de câțiva ani). Dar dacă îmi amintesc bine, cu JS și Drupal.t() funcția, nu este deloc posibilă traducerea variabilelor. Acest lucru se datorează faptului că scriptul Drupal a analizat de fapt valorile de către Drupal și a fost re-generat cu valorile traduse, stocat în cache cu valorile traduse și acest nou fișier este trimis în browser. Deci, nicio traducere nu are loc în browser, traducerea este de fapt pusă în aplicare de PHP pe server și un fișier nou este generat înainte de a trimite fișierul către browser.

Soluția este să vă asigurați că valorile dvs. sunt traduse în API-ul REST, astfel încât acestea să fie deja traduse atunci când JS-ul dvs. le primește și nu va necesita utilizarea Drupal.t() funcţie. Din postarea dvs. se pare că punctul final REST este, de asemenea, o instanță Drupal, așa că pentru a face acest lucru pe serverul REST ar trebui:

  1. Configurați serverul REST API pentru a fi un site multilingv, cu detectarea limbii prin URL.
  2. Faceți cererea către API folosind adresa URL multilingvă pentru limba care urmează să fie preluată.

De exemplu, dacă site-ul dvs. multilingv diferă prin prefixul căii, veți avea:

  • http://www.example.com/path/to/restserver [limba principală]
  • http://www.example.com/[LANGUAGE_PREFIX]/path/to/restserver (limbă LANGUAGE_PREFIX)

Apoi, JS-ul dvs. va solicita API-ul REST din calea lingvistică relevantă.

De multe ori găsesc că este benefic să generăm adresa URL pe partea de server și să treci această adresă URL generată de PHP, care va conține prefixul de limbă pentru limba curentă, către JS care apelează apoi URL-ul în mod dinamic.

Acest lucru se face mai întâi prin crearea unei biblioteci care adaugă fișierul dvs. JS și are o dependență de setările Drupal:

bibliotecă_exemplu:
  js:
    cale/către/fișier.js: {}
  dependențe:
    - core/drupalSettings

Apoi, elementul de randare ar atașa biblioteca și va transmite URL-ul fișierului JS din bibliotecă:

utilizați Drupal\Core\Url;
$page[
  'some_element' => [
    '#prefix' => '<div id="example_placeholder">',
    '#sufix' => '</div>',
    '#markup' => $this->t('Slogan'),
    '#attached' => [
      'library' => ['[MODULE]/example_library'],
      'drupalSettings' => [
        'exampleModule' => [
          'ajaxCallbackUrl' => Url::fromRoute('[RESTAPI ROUTE]', [], ['absolute' => TRUE])->toString(),
        ],
      ],
    ],
  ],
];

Acum, scenariul fișier.js va avea acces la adresa URL a API-ului REST cu prefixul de limbă, în drupalSettings.exampleModule.ajaxCallbackUrl variabil.

file.js:

function(drupalSettings) {

  function do Something() {
    console.log(drupalSettings.exampleModule.ajaxCallbackUrl);
  }
}(drupalSettings));

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.