Przejdź do treści
DedicatedPHP Kontakt

Zarządzanie treścią wielojęzyczną w PHP: model i proces redakcyjny

Projektuj wielojęzyczną treść w PHP, korzystając z powiązanych tłumaczeń, statusów redakcyjnych dla poszczególnych języków oraz jasnych zasad dotyczących URL-i, wyszukiwania i niekompletnych treści.

Diagram aplikacji PHP łączący zasób redakcyjny z tłumaczeniami i statusami publikacji dla poszczególnych języków

Aplikacja wielojęzyczna to nie tylko przetłumaczone etykiety interfejsu. Jeśli udostępnia również artykuły, karty produktów lub inne zasoby redakcyjne, musi określać język każdej treści, sposób powiązania jej wersji oraz to, co oznacza gotowość tłumaczenia do publikacji. Nieprecyzyjny model prowadzi do wyświetlania nieaktualnych tekstów, linków bez celu lub wersji roboczych użytkownikom, którzy nie powinni ich widzieć.

Planując zarządzanie treścią wielojęzyczną w PHP, warto rozdzielić decyzje dotyczące interfejsu, danych i procesu redakcyjnego. Implementacja może wykorzystywać pliki tłumaczeń interfejsu oraz bazę danych dla zmiennej treści, ale taki podział powinien wynikać z domeny i potrzeb osób redagujących.

Rozdzielenie języka interfejsu, języka oryginału i tłumaczenia

Rozdzielenie języka interfejsu, języka oryginału i tłumaczenia — guía visual de DedicatedPHP

Język interfejsu określa etykiety, komunikaty walidacyjne, formaty dat i inne teksty związane z produktem. W aplikacji PHP można nim zarządzać za pomocą katalogów tłumaczeń, na przykład plików uporządkowanych według locale, a następnie wybierać go na podstawie preferencji użytkownika lub konfiguracji sesji. Nie należy utożsamiać go z językiem przeglądanej treści.

Język oryginału wskazuje natomiast język, w którym utworzono zasób redakcyjny. Każde tłumaczenie jest wersją powiązaną z tym zasobem i ma własny język. Użytkownik może korzystać z interfejsu po hiszpańsku i otworzyć stronę, której oryginalna treść jest po angielsku; aplikacja powinna wyraźnie określić, czy jest to dozwolone i jak o tym poinformować.

Zapisuj znormalizowane kody języków i w razie potrzeby stosuj spójną politykę dotyczącą locale regionalnych. Nie zakładaj, że język i kraj są pojęciami wymiennymi: wariant regionalny może wpływać na tekst, ale też na formaty, dostępność lub wymagania handlowe. Określ, które locale obsługuje produkt oraz których używa się do rozstrzygania niekompletnych preferencji.

Wybór modelu danych odzwierciedlającego domenę

Istnieją trzy popularne wzorce, z różnymi kompromisami:

  • Pola dla poszczególnych języków: kolumny takie jak title_es i title_en są proste w użyciu, gdy liczba języków jest niewielka, zestaw pól stabilny, a zapytania bezpośrednie. Tracą elastyczność przy dodawaniu języków i uzależniają każdą zmianę schematu od katalogu języków.
  • Niezależne rekordy: każda wersja jest zapisywana jako osobny zasób. Może to być odpowiednie rozwiązanie, jeśli wersje mają rzeczywiście niezależne cykle życia lub struktury, ale wymaga innego, niezawodnego sposobu ich grupowania. Nie używaj podobnego tytułu ani URL-a jako niejawnego powiązania.
  • Powiązana tabela tłumaczeń: wspólny zasób jest powiązany z osobnym wierszem dla każdego języka, na przykład przez content_id i locale. Ułatwia to dodawanie języków i wyszukiwanie dostępnych wersji. Wymaga ograniczeń uniemożliwiających utworzenie kilku tłumaczeń tego samego zasobu w tym samym języku.

Powiązana tabela zwykle sprawdza się, gdy wersje mają wspólną tożsamość i strukturę, ale nie jest rozwiązaniem uniwersalnym. Jeśli niektóre pola nie podlegają tłumaczeniu — na przykład wewnętrzny identyfikator — mogą pozostać w encji wspólnej; lokalizowane pola redakcyjne należy umieścić w tłumaczeniu. Określ też, czy tłumaczenie może mieć własny URL, metadane wyszukiwania lub datę publikacji.

W bazie danych zdefiniuj klucze obce, unikatowość pary zasób–język oraz zachowanie podczas usuwania danych. Logika aplikacji w PHP powinna dodatkowo sprawdzać, czy dany język jest obsługiwany i czy powiązany zasób istnieje. Ograniczenia bazy danych chronią przed równoczesnymi zapisami i błędami, których nie zapobiega sama wcześniejsza walidacja.

Powiązanie wersji bez wymogu dostępności każdej z nich

Nie każdy zasób będzie dostępny we wszystkich językach, a poszczególne tłumaczenia nie zawsze zostaną ukończone w tym samym czasie. Modeluj tę rzeczywistość: brak wiersza nie powinien być uznawany za błąd integralności, jeśli tłumaczenie jest opcjonalne. Status redakcyjny powinien natomiast określać, co dzieje się, gdy wiersz istnieje, ale nie można go jeszcze opublikować.

Unikaj powielania w każdym tłumaczeniu informacji należących do wspólnego zasobu, chyba że domena wymaga wariantów. Jeśli tłumaczenia można odłączyć, przenieść lub zachować jako archiwum, zdefiniuj te operacje i wymagane uprawnienia. Do identyfikowania grupy wersji wykorzystuj stabilną relację, a nie podobieństwo tekstu, slugów czy dat.

Gdy tłumaczenie się zmienia, zapisuj, która wersja oryginału stanowiła punkt odniesienia, jeśli zespół musi wykrywać treści potencjalnie nieaktualne. Taki sygnał sam w sobie nie dowodzi, że tłumaczenie jest błędne; pozwala ustalić priorytet weryfikacji. W niektórych produktach wystarczy oznaczenie oczekujące na sprawdzenie, w innych potrzebna będzie historia wersji i audyt.

Definiowanie statusów redakcyjnych dla poszczególnych języków

Status publikacji powinien być przypisany do każdego tłumaczenia, jeśli każdą wersję językową można niezależnie przygotowywać, weryfikować i publikować. Zasób może być opublikowany w jednym języku, a w innym nadal pozostawać wersją roboczą. Pojedyncza flaga publikacji na poziomie zasobu nie odzwierciedla tej różnicy.

Zaplanuj niewielki, jawnie określony proces, na przykład: wersja robocza, w trakcie weryfikacji i opublikowana. Zdefiniuj, kto może zmieniać poszczególne statusy, które pola są wymagane oraz czy weryfikacja wymaga zatwierdzenia. Data publikacji, osoba odpowiedzialna i historia zmian mogą być niezbędne do obsługi procesu; unikaj dodawania statusów, które nie odpowiadają rzeczywistym działaniom zespołu.

Zapytania publiczne powinny filtrować wyniki według statusu i języka, zamiast polegać na tym, że interfejs redakcyjny ukryje nieopublikowane wiersze. W PHP umieść te reguły w warstwie dostępu do domeny lub w wielokrotnie wykorzystywanych zapytaniach, a następnie sprawdź, czy przestrzegają ich kontrolery, API i zadania działające w tle. Operacje edycji i publikacji muszą również weryfikować uprawnienia do konkretnych zasobów i języków.

Spójna obsługa braków, URL-i i wyszukiwania

W przypadku braku tłumaczenia możliwych jest kilka rozwiązań. Aplikacja może ukryć zasób w danym języku, poinformować, że jest dostępny tylko w innym, albo wyświetlić fallback. Wybierz rozwiązanie zależnie od rodzaju treści i wpływu na doświadczenie użytkownika; fallback nie może być przedstawiany jako tłumaczenie. Jeśli wyświetlana jest treść w innym języku, zaznacz to wyraźnie i pozostaw możliwość powrotu do żądanej wersji.

Stosuj inne zasady dla interfejsu, a inne dla treści. To, że etykiety nawigacji mają fallback do innego katalogu, nie oznacza, że artykuły powinny być automatycznie zastępowane wersją oryginalną. Fallback redakcyjny powinien ograniczać się do dozwolonych języków i treści dopuszczonych do publikacji; nie może zwracać wersji roboczych.

URL-e powinny wskazywać istniejącą wersję lub podlegać udokumentowanej regule przekierowania. Przy zmianie języka wyszukaj tłumaczenie tego samego zasobu; jeśli nie istnieje, wskaż użytkownikowi dalsze działanie zamiast tworzyć ścieżkę, która tylko pozornie jest prawidłowa. Z myślą o SEO unikaj publikowania pustych stron lub duplikatów powstających przez niewidoczne fallbacki. Wyszukiwarka powinna indeksować wyłącznie kwalifikujące się wersje oraz stosować właściwy język do filtrowania i prezentowania wyników.

Lista kontrolna przed publikacją

Lista kontrolna przed publikacją — guía visual de DedicatedPHP
  • Czy w modelu rozdzielono pojęcia języka interfejsu, języka oryginału i języka każdego tłumaczenia?
  • Czy system uniemożliwia zapisanie dwóch tłumaczeń tego samego zasobu w tym samym języku?
  • Czy tłumaczenie może być nieobecne bez powodowania niespójnego stanu?
  • Czy zespół potrafi rozróżnić statusy: wersja robocza, w trakcie weryfikacji i opublikowana dla każdego języka?
  • Czy publiczne adresy URL i linki do zmiany języka sprawdzają, czy istnieje widoczna wersja?
  • Czy fallback jest określony dla danego przypadku użycia, komunikowany użytkownikowi i nigdy nie ujawnia wersji roboczych?
  • Czy wyszukiwanie filtruje wyniki według języka i statusu oraz przestaje indeksować wycofaną wersję?
  • Czy przetestowano uprawnienia, równoczesną edycję, usuwanie, niekompletną treść i zmianę języka?

Przetestuj również wycofanie tłumaczenia, do którego prowadzą już linki, aktualizację oryginału po opublikowaniu wersji oraz bezpośrednie żądanie niedostępnego URL-a. W każdym przypadku sprawdź odpowiedź, nawigację i widoczność w wynikach wyszukiwania. Celem nie jest wymuszenie jednakowego tempa pracy we wszystkich językach, lecz zapewnienie każdej wersji własnej tożsamości, weryfikowalnego statusu i przewidywalnego zachowania dla redaktorów oraz użytkowników.

Chcesz zastosować te pomysły w swoim projekcie?Omówmy Twoją platformę PHP.
Zobacz powiązaną usługę