Puncte:0

Cum se modifică titlul paginii „Creați X” în „Adăugați X” pentru toate X?

drapel kz

În Drupal 7, a existat drupal_get_title()și drupal_set_title(). Ei sunt istorie.

Vreau să modific titlul paginii „Creați X” în „Adăugați X” pentru toate X și cred hook_preprocess_page_title() în fișierul meu .theme este locul potrivit pentru a face acest lucru. (Dacă nu sunteți de acord, vă rugăm să spuneți.)

i.e. Vreau să fie „Adăugați X” pentru orice „X” atunci când inițial a fost „Creați X”. De exemplu: „Creați articol” ar trebui să devină „Adăugați articol”. Și dacă titlul este „Articol de bar”, ar trebui să rămân așa.

Practic, vreau să adulmec șirul de titlu și dacă începe cu „Creare”, îl modific în „Adăugați”. Acesta este până acum am obținut și acesta este evident incomplet:

/**
 * Implementează hook_preprocess_page_title().
 */

Prima incercare:

funcția mytheme_preprocess_page_title(&$variabile) {
  $cerere = \Drupal::cerere();
  $route_match = \Drupal::routeMatch();
  $titlu = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());
}

A doua încercare, bazată pe sugestia 4k4:

funcția mytheme_preprocess_page_title(&$variabile) {
  $titlu = $variabile['titlu'];
  if ($title instance of TranslatableMarkup) {
    $titlu = $titlu->getUntranslatedString();
    $title = str_replace('Creați', 'Adăugați', $titlu);
    $variabile['titlu'] = t($titlu);
  }
  else {
    $variables['title'] = Markup::create(str_replace('Create', 'Add', $title));
  }  
}

Titlurile pe care vreau să le schimb provin din nucleul Drupal și sunt traducibile, așa că este instanceof TranslatableMarkup ramură care este executată, dar sunt de acord cu o rezervă în cazul în care nu sunt, este o idee bună.

Cu toate acestea, deși este un început bun, aceasta nu este o soluție completă. Schimbă titlul redat al formularului de adăugare a articolului din „Creați articol” în „Adăugați @nume”.

introduceți descrierea imaginii aici

Am votat răspunsul cu 4k4, deoarece merge mult mai departe spre o soluție decât prima mea încercare, dar încă nu este complet.

Nu vreau să folosesc Anulări șiruri din mai multe motive, mai ales pentru că această temă ar trebui să funcționeze peste traduceri fără a necesita configurație suplimentară atunci când este implementată.

No Sssweat avatar
drapel ua
Netestat, dar puteți încerca să o rezolvați prin fișier șablon. [page-title.html.twig](https://api.drupal.org/api/drupal/core%21modules%21system%21templates%21page-title.html.twig/8.2.x) modificați `{{ title } }` la `{{ title|inlocuire({'Creați X': "Adăugați X"}) }}`
Free Radical avatar
drapel kz
Mulțumesc @NoSssweat! Da, functioneaza. Încă sper la un răspuns care să explice cum se face în PHP. Acest lucru nu va funcționa cu titlurile traduse.
No Sssweat avatar
drapel ua
Hmm încercați `|replace({'Creați X'|t: "Adăugați X"|t})`
Puncte:1
drapel cn

Vreau să modific titlul paginii „Creați X” în „Adăugați X” pentru toate X și eu cred că hook_preprocess_page_title() din fișierul meu .theme este corect loc să o faci. (Dacă nu sunteți de acord, vă rugăm să spuneți.)

Puteți modifica doar titlul afișat în eticheta body, nu metaeticheta titlu din eticheta html.

$title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());

Acest lucru vă obține doar titlul din definiția rutei sau apel invers, nu un titlu stabilit de #titlu în ieșirea redată.

$title nu este un șir. Sforul este undeva acolo, dar cum fac extrage-l pentru a vedea cu ce începe?

Este un obiect de marcare. Fie una simplă, fie una traducabilă. Vedea Cum editați conținutul unei instanțe Drupal\Core\Render\Markup printr-o funcție de preprocesare în Drupal 8? sau Cum schimb textul de pe butonul de trimitere din formularul de nod?

Cum îl schimb de fapt în contextul unui cârlig de preprocesare. i.e. ce este echivalentul lui drupal_set_title() în acest context?

Într-un cârlig de preprocesare puteți modifica doar variabilele pe care șablonul le afișează, în acest caz:

$variables['title'] = 'Titlu Foo';

Dacă conține marcaj HTML pentru a evita autoescape:

$variables['title'] = \Drupal\Core\Render\Markup::create('<i>Foo</i> titlu');

Dacă este tradusibil:

$variables['titlu'] = t('titlu Foo');

Exemplu de cod:

utilizați Drupal\Core\StringTranslation\TranslatableMarkup;
utilizați Drupal\Core\Render\Markup;
    
/**
 * Implementează hook_preprocess_page_title().
 */
funcția mymodule_preprocess_page_title(&$variabile) {
  $titlu = $variabile['titlu'];
  if ($title instance of TranslatableMarkup) {
    $title_untranslated = $title->getUntranslatedString();
    $title_replaced = str_replace('Creați', 'Adăugați', $title_untranslated);
    $variables['titlu'] = t($title_replaced, $title->getArguments());
  }
}

  
Free Radical avatar
drapel kz
Vreau să fie tradus. Cu toate acestea, nu vreau ca titlul să fie „Titlu Foo”, vreau să fie „Adăugați X” pentru orice „X” atunci când inițial era „Creați X”. (de exemplu, „Creați articol” ar trebui să devină „Adăugați articol”. Și dacă titlul este „Articol bar”, nu vreau să fac nimic.Voi arunca o privire mai atentă la linkurile pe care le furnizați despre obiectele de marcare, dar încă nu mi-am dat seama cum să îmi dau seama dacă șirul începe cu „Creare”.
4uk4 avatar
drapel cn
OK, deci doriți să înlocuiți versiunea originală în limba engleză și apoi să traduceți versiunea înlocuită. Acest lucru este puțin mai complicat, deoarece marcajul translatable returnează ca șir șirul deja tradus și trebuie să utilizați o metodă în loc să îl turnați într-un șir. Adaug un exemplu de cod, de asemenea, cu o rezervă pentru marcajul simplu care funcționează cu turnarea șirurilor.
4uk4 avatar
drapel cn
Am adăugat argumentele t() pentru substituent. De asemenea, am eliminat alternativa pentru că variabila titlu poate conține conținut diferit, de asemenea matrice de randare întregi.
Free Radical avatar
drapel kz
Grozav! Ultima încarnare funcționează.
4uk4 avatar
drapel cn
BTW, captura de ecran pe care ați adăugat-o este ruta node.add. Puteți înlocui acest apel invers de titlu în definiția rutei și funcționează și în breadcrumbs și metatag-uri: https://api.drupal.org/api/drupal/core%21modules%21node%21src%21Controller%21NodeController.php/function/NodeController %3A%3AaddPageTitle/9.2.x
Free Radical avatar
drapel kz
Îndrumarea dumneavoastră este foarte apreciată, dar o parte din ele îmi trece mult peste cap. Ați putea vă rog să-mi spuneți unde se află definiția rutei mele și cum să o schimb (sau să mă îndrumați către un tutorial adecvat).
4uk4 avatar
drapel cn
Vezi de exemplu (trebuie doar să înlocuiți numele rutei): https://drupal.stackexchange.com/questions/217680/override-user-edit-page-title

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.