Drupal acceptă conceptul de limbaj de interfață și limbaj de conținut. Eu (și fiecare client pe care l-am întrebat vreodată) par să am o părere diferită despre ceea ce este „conținut” și ce este „interfață” decât are Drupal (în majoritatea cazurilor). Consider Interfața ca elementele pe care un administrator sau un editor le-ar folosi pentru a-și face treaba (meniul de administrare, fila de editare, detalii de ajutor pentru formulare etc.), iar conținutul este ceea ce ar vedea non-administratorii (adesea, acesta este Anon, dar nu întotdeauna).
O viziune pe care o creez pentru a prezenta „conținut” pe site, în mod firesc o consider conținut – dar Drupal are o idee inconsecventă și adesea incorectă despre ce este acesta.
Pentru început, am configurat site-ul astfel încât limba interfeței să fie definită de limba preferată a utilizatorului (cum ar seta un administrator/editor de site) și limba conținutului este definită de prefixul codului de limbă URL.
Un exemplu de vizualizare de testare arată astfel în FR (url-ul este /fr/test) - Limba interfeței este setată la EN:
Acest lucru este în mod clar incorect, așa cum se poate vedea cu afișajul corespunzător când am setat limba interfeței la FR:
Views are numeroase opțiuni pentru a seta modul în care este determinată limba de randare a „conținutului”. Pentru exemplul meu de mai sus, este setat să se redeze pe baza „limbii de conținut” a paginii (și, prin urmare, adresa URL). Acest lucru funcționează pentru majoritatea datelor de câmp (titlu, termeni de taxonomie, câmpuri de text traduse); dar, din păcate, nu funcționează pentru câmpurile Datetime - par a fi greu codificate pentru a traduce incorect folosind Interfață. Dar puteți vedea, de asemenea, că porțiunile de configurare ale vizualizării (titlul vizualizării, etichetele câmpurilor etc.) sunt traduse și ca interfață.
Există vreo modalitate de a spune unei vizualizări să traducă folosind limba de conținut?
Am folosit următorul cod:
$languageManager = \Drupal::languageManager();
$langcode = $languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId();
$language = $languageManager->getLanguage($langcode);
$languageManager->setConfigOverrideLanguage($limba);
în cadrul unei funcții de preprocesare a blocurilor pentru a permite unora dintre bucățile bloc care folosesc incorect limbajul de interfață să se traducă cu limba de conținut. Există vreo modalitate similară de a suprascrie limba interfeței pe care o vizualizare o folosește pentru traducere? Sper că este ceva asemănător codului de mai sus, dar pur și simplu nu îl introduc în locul potrivit (am încercat fără succes cârlige pentru pre-build, pre-render, query_alter).
Dacă acest lucru este posibil, mi-ar plăcea să scriu un modul contrib pentru a utiliza interfața existentă într-o vizualizare pentru a seta limbajul de randare și a-l face să redea totul, mai degrabă decât anumite câmpuri.