Twoje wymagania:
aby moja witryna działała w wielu językach
jako uwierzytelniony użytkownik
, muszę mieć możliwość tłumaczenia na raz wszystkich wywołań tłumaczeń znalezionych w bazie kodu mojej witryny wykonanych za pomocą funkcji t ().
Czy ten opis wymagań jest nawet bliski temu, o co prosisz?
Roboty
Jak ktoś powiedział - robot może teoretycznie przejść przez całą witrynę, aby wymusić rejestrację wszystkich wywołań t (). Ale 1) robot indeksujący nie wie, które strony należy indeksować; 2) dlatego nie chcemy utrzymywać listy stron do indeksowania; 3) nie chcemy używać robota, kropka. Eww. Po prostu eww. Dobrze?
Problem
- Nie mamy listy wszystkich ciągów tłumaczeń.
- Drupal / PHP to dynamiczny język w przeciwieństwie do kompilowanego języka C. Nie możemy więc iść i powiedzieć na przykład: skompiluj całą
t()
bazę kodu, a następnie znajdź wszystkie instancje tej funkcji , a następnie zarejestruj te instancje w bazie danych, a następnie przetłumacz wszystkie zarejestrowane instancje za t()
jednym razem. Nie sądzę, że jest to opcja, którą mamy na stole.
- Narzędzie do analizy kodu statycznego byłoby bezradne z tego samego powodu, dla którego przeszukiwacz byłby bezradny. Znalazłem to
t()
w tym pliku. Świetny! W jakim adresie URL jest używany? Jaki jest kontekst?
Zaatakowanie problemu za pomocą bieżących narzędzi (Drupal i niektórych modułów contrib) oraz obecnych ograniczeń (polegających na wywołaniach motywów w czasie rzeczywistym -> plikach szablonów -> t()
wywołaniach) wygląda tutaj jak ścieżka wyjścia bez wyjścia. Być może będziemy musieli pomyśleć trochę po wyjęciu z pudełka.
Czego potrzebujemy
- Potrzebujemy źródła danych, modelu, który mówi mi, jakie mamy obecne ciągi tłumaczeń i jaki jest ich kontekst -
- Proaktywny model danych. Bieżący model danych jest reaktywny (model jest aktualizowany za każdym razem, gdy
t()
nastąpi wywołanie ). Potrzebujemy proaktywnego modelu danych - takiego, w którym aplikacja zajmuje się wyszukiwaniem t()
instancji, zanim zostaną faktycznie wykonane przez klienta.
- Potrzebujemy kontekstu.
t()
sam tego nie wycina - ponieważ - nie wiemy, że tłumaczymy „foo”, ale język docelowy, na który tłumaczymy, zależy od adresu URL miejsca, w którym t()
występuje. Nawet gdybyśmy mogli na stałe zakodować język docelowy w t()
połączeniu, powiedzmy, używając połączenia otokowego, nie działałoby to dla twoich celów.
Zidentyfikowałem niektóre narzędzia, które - gdybyśmy je mieli - pomogłyby naszemu problemowi. Za pomocą tych narzędzi możemy przejść do modelu danych i powiedzieć: daj mi wszystkie zawinięte ciągi t()
, które nie zostały jeszcze wypełnione. Teraz wstaw te tłumaczenia. Dziękuję Ci.
I kiedy następnym razem pojawi się klient, tłumaczenia są na miejscu.
Jak moglibyśmy ... zbudować te narzędzia?
Ograniczenia
- Językiem docelowym nie może być szablon, który określa adres URL. Zakładając, że ciąg musi obsługiwać dowolny język.
- Przetłumaczony ciąg nie może znajdować się w szablonie. Tłumaczenie będzie znajdować się w bazie danych.
Teraz, gdy bardziej zastanowiłem się nad problemem i zidentyfikowałem pewne wyzwania i ograniczenia, mogę pomyśleć o znalezieniu dostępnych rozwiązań lub stworzeniu niestandardowych rozwiązań.
Rozwiązanie burzy mózgów
Potrzebuję czegoś, co łączy ze sobą „wszystko”. Co z ... bytem?
- Jednostka może przechowywać produkt, który musi zostać przetłumaczony.
- Podmioty mogą zapewnić relację - klej - między produktem, który należy przetłumaczyć, a jego kontekstem.
- Jednostka może określić powiedzmy w polu domyślną lokalizację adresu URL produktu.
- Tokeny mogą służyć do określania alternatywnych lokalizacji (języków?), W których pojawi się produkt.
- Podmioty zapewniają nam proaktywny model danych, którego potrzebujemy i jego kontekst. Co z kolei pozwala nam na takie rzeczy, jak: przejście do bazy danych, pobranie wszystkich jednostek produktu, a jeśli nie mają łańcucha tłumaczenia dla pól X, Y i Z, utwórz te łańcuchy tłumaczenia.
Kiedy następnie klient chwyta /pl/product/200
, udajesz się do bazy danych, wyszukujesz produkt 200 i chwytasz już istniejące pl
tłumaczenie. Masz także pole tytułu i podpisu dla tego produktu? Tłumaczenia też powinny tam być.
Pamiętaj, że jestem bardzo niejasny i ogólny, jeśli chodzi o używany moduł tłumaczący. Możesz równie dobrze skorzystać z własnego modułu tłumaczącego - najprawdopodobniej tak jest. Wszystkie modele tłumaczeń, które do tej pory widziałem w Drupal (od D7, jeszcze nie oglądałem D8) są reaktywne, a nie proaktywne.
W skrócie
Teoretycznie istnieją narzędzia do budowania tego, czego potrzebujesz, a podmioty są kluczowym składnikiem, który łączy wszystko razem: - dane (ciąg tłumaczący), - języki docelowe. Nie musisz być w samym Podmiocie, najlepiej w języku taksonomii, na przykład w językach produktów. a może ogólną taksonomię również dla innych podmiotów. - Kontekst. Adres URL, pod którym pojawia się jednostka. Adres URL zawierałby token, który z kolei odwoływałby się do systematyki języka docelowego.
Dzięki tym trzem składnikom możesz powiedzieć: Złap wszystkie product
byty, idź na URL alias
pole, zdobądź token taksonomii , przejdź przez wszystkie możliwe kombinacje terminów, przedstaw wszystkie kombinacje obecnemu użytkownikowi używając bardzo dużej brzydkiej formy - lub AJAX - i formularze wieloetapowe (coś takiego), a ponieważ aktualnie zalogowany użytkownik tłumaczy różne języki dla produktu 200, zapisz je gdzieś w bazie danych
Gdzieś w bazie danych może być pole Field API w encji, pole ustawień należące do każdej encji (niezupełnie Field API, ale nadal może przechowywać dane) lub osobna tabela, której używasz do tego. Myślę, że zapisanie danych w Entity pozwoliłoby uporządkować kod i dane i ułatwić.
Budowanie: Możliwe rozwiązania
- D8MI (Inicjatywa wielojęzyczna Drupal 8)
- Kod niestandardowy: tłumaczenia „indeksowe” udostępniane w szablonach przez t () poprzez programowe zapytania i renderowanie dostępnych pakietów oraz powiązanych z nimi implementacji haków motywu.
Pseudo kod
Foreach encja (typu x),
Znajdź wszystkie języki (taksonomia lub język podstawowy związany z produktem),
Renderuj encję,
- aby wykryć jej ciągi t ()
- renderuj wywołania theme (), który obsługuje wielojęzyczną warstwę prezentacji produkt, a nie sam model danych produktu.
Wynik:
- Pierwsze wywołanie w celu wyświetlenia szablonu encji w każdym języku zwraca domyślną implementację języka dla każdego wywołania.
- Parametry t () w szablonie są teraz buforowane w Drupal i gotowe do tłumaczenia (dla każdej instancji języka, nie każdej instancji produktu).
- Użytkownik z rolą „tłumacz” może teraz przejść do interfejsu tłumaczenia i przetłumaczyć wszystkie dostępne parametry t () dla każdego języka.
- Właściciel witryny nie musi czekać, aż klienci odwiedzą każdą stronę produktu lub ręcznie odwiedzą każdą stronę produktu, ponieważ zrobiono to dla niego programowo.
Otwarte pytania:
- Jaki jest kontekst? Jeśli wykonam programowe wywołanie funkcji theme () dla każdego pakietu encji „produktu”, czy rejestruje lokalizację, z której wykonano połączenie? Czy rejestruje adres URL węzła? Czy można zmienić „kontekst”? Gdzie zapisywany jest kontekst? Co dzieje się, gdy masz „dynamiczne” szablony - tj. Kiedy masz więcej niż jeden szablon na produkt i jak zaczynasz wykrywać te odmiany?
Jak zawsze, teoretyzowanie i pseudokod nadaje się tylko do burzy mózgów. Ale w fazie rozwoju nie będziemy wiedzieć, z czym tak naprawdę mamy do czynienia, dopóki nie zaczniemy prototypowania. Tak więc, po opracowaniu kilku ograniczeń, możliwych rozwiązań oraz możliwych problemów lub pytań - mogę teraz wdrożyć dowód koncepcji lub działającego prototypu. Na niektóre powyższe otwarte pytania można odpowiedzieć tylko w ten sposób, a najwcześniej prototypujemy (niezależnie od sukcesu lub porażki), możemy zacząć odpowiadać na niektóre z tych pytań - lub całkowicie zmienić podejście. Bądź na bieżąco ~
wget
lub cokolwiek. Hackish, ale powiedziałeś, że to dozwolone (: