Wielojęzyczna konfiguracja MODX

<?php
$locale = $modx->getOption('locale');
setlocale(LC_ALL, $locale);

Kiedy kolejnym punktem Mapy Drogowej stało konfigurowanie wielojęzyczności, nieoczekiwanie dla siebie nie mogłem znaleźć obszernego i wyczerpującego dokumenta, który byś wyjaśnił procedurę krok po kroku. Chociaż były. Może słabo szykałem? Niektóre dokumenty oficjalne zostały stracione w komnacie #404 i porady na forach czasami sprzeczne lub nie działają dziś. Tak więc postanowiłem, że muszę koniecznie opublikować jednym dokumentem wskazówki jak skonfigurować wiełojęzyczną stronę internetową na MODX.

Kopia zapasowa

Nie będzie zbytecznie przypomnieć że trzeba co najmiej zapisać kopię bazy danych. Jeśli to możliwe, takie rzeczy powinny być wykonywane na lustrze i uruchamiane online, kiedy wszystko jest sprawdzone i działa jak należy.

Instalacja XRouting a Babel

Znajdź w menu głównym ExtrasInstaller. Naciśnij Download Extras i znajdź XRouting. Znajduje się w sekcji Internacjonalizacja. Jego zadaniem jest przełączanie kontekstów w zależności od adresu URL wymaganego przez użytkownika. Ostatni raz został zaktualizowany w 2015 roku. Są także opcje dodatków ostatnio zaktualizowanych w 2016 i 2017 roku. Więc wszystkie są, powiedzmy, ... dojrzałe. Mogą być tak dobre, że nie potrzebują dalszych aktualizacji ... W każdym razie wybór mamy.

Ekran menedżera pakietów

Za tym Download, wtedy Back to Package Manager, znajdź ten dodatek i naciśnij Install.

Wykonaj te same kroki z dodatkiem Babel. Tutaj możesz zrobić podstawową konfigurację:

Ustawienia Babel

Pierwsze pole zawiera listę kontekstów, które Babel będzie obsługiwał. Później można to zrobić przez ustawienie systemu babel.contextKeys. Treść trzeciego pola idzie do ustawienia babel.syncTvs. Te zmienne szablonu będą synchronizowane w różnych kontekstach.

Twórz konteksty i ustawienia systemowe

Domyślnie MODX udostępnia dwa konteksty: mgr i web. Odpowiednio dla manadgera i stron dla szekiego dostępu.

Domyślne konteksty MODX

Następnym krokiem jest stworzenie kontekstów dla każdego języka. Naciśnij Create New i uzupełnij wymagane pola:

Stworzenie kontekstu

Teraz nowo utworzony katalog kontekstu musi pojawić się w widoku drzewa zasobów:

Nowy kontekst w drzewie zasobów

To tylko początek. Teraz musisz skonfigurować ustawienia systemowe, które będą używane w kontekście. Właśnie dlatego potrzebowaliśmy różnych kontekstów dla każdego języka. Aby to zrobić, kliknij prawym przyciskiem myszy w kontekście i wybierz opcję Update Context:

Uaktualnij kontekst

Pełna lista ustawień:

Ustawienia systemowe dla kontekstu

Jasna rzecz, że moje dane pokazałem tylko dla demonstracji, użyj własnych.

Nie przegap niczego. na przykład, myślałem, że ponieważ http_host jest taki sam dla wszystkich kontekstów, zostanie wzięty ze wspólnej przestrzeni i pominie go. Potem zmarnowałem dużo czasu, szukając na powód dla błądu 404 w adresach URL dostarczonych przez [[BabelTranslation]], zanim zorientowałem się, że to ustawienie jest obowiązkowe dla każdego kontekstu.

Przetłumacz strony

Teraz jesteś gotowy do tłumaczenia stron. Otwórz strone, wybierz język zlewa od przecisku Save a kliknij Create Translation:

Stwórz tłumaczenia stron

Edytuj szablony

Teraz spójrz na swóją nowo przetłumaczoną stronę, klikając przycisk View. Jeśli strona wygląda tak, jak powinna, przejdź do następnego rozdziału. Jeżeli masz uszkodzony CSS, wadliwe działanie JS, mogą też nie ładować media lub jeszcze coś w tym rodzaju, musisz poprawić ścieżki do zasobów. Ponieważ istnieją niezliczone sposoby tworzenia stron, zwrócę Twoją uwagę na ustawienia, które stworzyliśmy przed chwilą dla naszych kontekstów.

Ale najpierw możesz skonfigurować ustawienia regionalne serwera za pomocą PHP, jeśli prezentujesz daty lub inne zlokalizowane dane dla swoich czytelników. W tym przypadku można uruchamiać snippet na samym początku szablonu dla ustawienia potrzebnej lokali:

<?php
$locale = $modx->getOption('locale');
setlocale(LC_ALL, $locale);

Wzieliśmy zmienną $locale z ustawienia systemu, którego ustawiłeś wcześniej dla swojego kontekstu. Pamiętasz?

Teraz sprawdź dlaczego nie ładują się zasoby. Sprawdź teraz, dlaczego zasoby nie są ładowane. Najbardziej oczywistym powodem jest użycie względnych ścieżek, ale podstawowy adres URL został zmieniony dla danego kontekstu:

<base href="[[++site_url]]">
<!--
    <base href="https://sampledom.ain/pl/">
        vs
    <base href="https://sampledom.ain/">
-->

Więc w jakiś sposób trzeba podać właściwe ścieżki do zasobów twojej strony. Oto jeden z możliwych sposobów:

<script defer src="[[++server_protocol]]://[[++http_host]]/[[++tpl]]/js/site.min.js"></script>

Lexicon

Lexicon jest dobrze udokumentowany. Przeczytaj ten artykuł. Poczekam tutaj.

Witam spowrotem :)

Stworzyłem własną przestrzeń imion. Obawiam się, że można je zastąpić aktualizacjami ... Chociaż nie jestem tego pewien.

Przestrzeń imion

Teraz możesz dodawać własne zapisy w taki sposób:

Sterowanie Lexicon

Inne uwagi

Dokładnie przejrzyj kod strony, aby znaleźć co poprawić. Niektóre z kandydatów to: atrybut lang tagu html, twitter i opengraph opis strony, okruchi itp.

Dodaj przełącznika języków do interfejsu

Bardzo prosto, tu jest opis: Babel.BabelLinks

Pomóż znaleźć siebie

Alternatywne linki

Google sugeruje użycie hreflang, aby pomóc im odpowiednio zindeksować Twoją witrynę. W tym celu możesz warunkowo użyć snippeta [[BabelTranslation]]. Mi nie udało się – w każdym kontekscie miełem te same dane z niego. Odkąd minęły miesiące, nie pamiętam, co dokładnie zmieniłem w nim – jakiś drobiazg. Oto mój wariant:

<?php
$babel = $modx->getService('babel', 'Babel', $modx->getOption('babel.core_path', null, $modx->getOption('core_path').'components/babel/').'model/babel/', $scriptProperties);

/* be sure babel and babel TV is loaded */
if (!($babel instanceof Babel) || !$babel->babelTv)
    return;

$result = '';
$id = $modx->resource->get('id');
$linkTemplate = '<link rel="alternate" hreflang="%1$s" href="%2$s">';

$linkedResources = $babel->getLinkedResources($id);

if (isset($linkedResources) && is_array($linkedResources) && count($linkedResources) > 1) {
    foreach($linkedResources as $context => $id) {
        $resourceObject = $modx->;getObject('modResource');
        $url = $modx->makeUrl($id, "", "", "full");
        $result .= sprintf(
            $linkTemplate,
            $context == 'web' ? 'en' : $context,
            $url
        ) . "\n";
    };
    $result .= sprintf(
        $linkTemplate,
        'x-default',
        $modx->makeUrl($linkedResources['web'], "", "", "full")
    ) . "\n";
};

return $result;

Mapa strony

Używam [[GoogleSiteMap]] dla generowania XML mapy strony. Tylko mapa nie zawiera przetłumaczone strony 😞 Oto cześć, co nas interesuję:

// Set context(s)
$context = array_filter(array_map('trim', explode(',', $modx->getOption('context', $scriptProperties, $modx->context->get('key'), true))));

To ustawienie systemowe jest jakoś puste. Nie jestem pewien, czy jest ustawione ręcznie lub dynamicznie według jakiegoś kodu, więc dokonałem zamiennika i odpowiedznio poprawiłem snippet:

Нова установка для GoogleSiteMap

Napisz do mnie, jeżeli byłem pomocny. Jeśli coś z tego nie zadziałało, też nie wahaj się ze mną skontaktować.