Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Strona internetowa z najlepszymi praktykami w wielu językach

Założenie tematu

Witryna wielojęzyczna ma trzy różne aspekty:

  • tłumaczenie interfejsu
  • treść
  • trasowanie adresów URL

Chociaż wszystkie są ze sobą powiązane na różne sposoby, z punktu widzenia CMS są zarządzane za pomocą różnych elementów interfejsu użytkownika i inaczej przechowywane. Wydajesz się być pewny wdrożenia i zrozumienia dwóch pierwszych. Pytanie dotyczyło tego drugiego aspektu – „Tłumaczenie adresów URL? Czy powinniśmy to robić, czy nie? iw jaki sposób?”

Z czego można zrobić adres URL?

Bardzo ważną rzeczą jest to, aby nie przepadać za IDN . Zamiast tego preferuj transliterację (też:transkrypcja i latynizacja). Chociaż na pierwszy rzut oka IDN wydaje się realną opcją dla międzynarodowych adresów URL, w rzeczywistości nie działa tak, jak reklamowano z dwóch powodów:

  • niektóre przeglądarki zmienią znaki spoza ASCII, takie jak 'ч' lub 'ž' w '%D1%87' i '%C5%BE'
  • jeśli użytkownik ma niestandardowe motywy, czcionka motywu najprawdopodobniej nie będzie miała symboli dla tych liter

Właściwie kilka lat temu próbowałem podejść do IDN w projekcie opartym na Yii (horrible framework, IMHO). Spotkałem się z obydwoma wyżej wymienionymi problemami przed zeskrobaniem tego rozwiązania. Podejrzewam też, że może to być wektor ataku.

Dostępne opcje... tak jak je widzę.

Zasadniczo masz dwie możliwości, które można streścić jako:

  • http://site.tld/[:query] :gdzie [:query] określa wybór języka i treści

  • http://site.tld/[:language]/[:query] :gdzie [:language] część adresu URL określa wybór języka i [:query] służy wyłącznie do identyfikacji treści

Zapytanie to Α i Ω ..

Powiedzmy, że wybierasz http://site.tld/[:query] .

W takim przypadku masz jedno główne źródło języka:zawartość [:query] człon; oraz dwa dodatkowe źródła:

  • wartość $_COOKIE['lang'] dla tej konkretnej przeglądarki
  • lista języków w nagłówku HTTP Accept-Language

Najpierw musisz dopasować zapytanie do jednego ze zdefiniowanych wzorców routingu (jeśli wybrałeś Laravel, to przeczytaj tutaj ). Po pomyślnym dopasowaniu wzorca musisz znaleźć język.

Musiałbyś przejść przez wszystkie segmenty wzoru. Znajdź potencjalne tłumaczenia dla wszystkich tych segmentów i określ używany język. Dwa dodatkowe źródła (plik cookie i nagłówek) będą używane do rozwiązywania konfliktów routingu, gdy (nie „jeśli”) się pojawią.

Weźmy na przykład:http://site.tld/blog/novinka .

To jest transliteracja "блог, новинка" , co w języku angielskim oznacza w przybliżeniu "blog", "latest" .

Jak już można zauważyć, w języku rosyjskim „блог” będzie transliterowane jako „blog”. Co oznacza, że ​​w pierwszej części [:query] ty (w najlepszym przypadku) ) skończy się na ['en', 'ru'] lista możliwych języków. Następnie bierzesz następny segment - "novinka". To może mieć tylko jeden język na liście możliwości:['ru'] .

Gdy lista zawiera jeden element, pomyślnie znalazłeś język.

Ale jeśli skończysz z 2 (przykład:rosyjski i ukraiński) lub więcej możliwości .. lub 0 możliwości, w zależności od przypadku. Będziesz musiał użyć pliku cookie i/lub nagłówka, aby znaleźć właściwą opcję.

A jeśli wszystko inne zawiedzie, wybierz domyślny język witryny.

Język jako parametr

Alternatywą jest użycie adresu URL, który można zdefiniować jako http://site.tld/[:language]/[:query] . W takim przypadku, tłumacząc zapytanie, nie musisz zgadywać języka, ponieważ w tym momencie już wiesz, którego użyć.

Istnieje również dodatkowe źródło języka:wartość cookie. Ale tutaj nie ma sensu bawić się nagłówkiem Accept-Language, ponieważ nie masz do czynienia z nieznaną liczbą możliwych języków w przypadku „zimnego startu” (gdy użytkownik po raz pierwszy otwiera witrynę z niestandardowym zapytaniem).

Zamiast tego masz 3 proste, priorytetowe opcje:

  1. jeśli [:language] segment jest ustawiony, użyj go
  2. jeśli $_COOKIE['lang'] jest ustawiony, użyj go
  3. użyj domyślnego języka

Gdy znasz język, po prostu próbujesz przetłumaczyć zapytanie, a jeśli tłumaczenie się nie powiedzie, użyj „wartości domyślnej” dla tego konkretnego segmentu (na podstawie wyników routingu).

Czy nie ma trzeciej opcji?

Tak, technicznie można połączyć oba podejścia, ale skomplikowałoby to proces i obejmowałoby tylko osoby, które chcą ręcznie zmienić adres URL http://site.tld/en/news na http://site.tld/de/news i spodziewaj się, że strona z wiadomościami zmieni się na niemiecki.

Ale nawet ten przypadek można prawdopodobnie złagodzić za pomocą wartości cookie (która zawierałaby informacje o poprzednim wyborze języka), aby zaimplementować z mniejszą magią i nadzieją.

Którego podejścia użyć?

Jak można się domyślić, polecam http://site.tld/[:language]/[:query] jako bardziej rozsądna opcja.

Również w prawdziwym słowie miałbyś trzecią główną część w adresie URL:"tytuł". Jak w nazwie produktu w sklepie internetowym lub nagłówku artykułu w serwisie informacyjnym.

Przykład:http://site.tld/en/news/article/121415/EU-as-global-reserve-currency

W tym przypadku '/news/article/121415' byłoby zapytanie, a 'EU-as-global-reserve-currency' to tytuł. Wyłącznie do celów SEO.

Czy można to zrobić w Laravel?

Trochę, ale nie domyślnie.

Nie znam go zbyt dobrze, ale z tego, co widziałem, Laravel używa prostego mechanizmu routingu opartego na wzorach. Aby zaimplementować wielojęzyczne adresy URL, prawdopodobnie będziesz musiał rozszerzyć podstawowe klasy , ponieważ wielojęzyczny routing wymaga dostępu do różnych form przechowywania (bazy danych, pamięci podręcznej i/lub plików konfiguracyjnych).

Jest przekierowany. Co teraz?

W rezultacie otrzymasz dwie cenne informacje:aktualny język i przetłumaczone segmenty zapytania. Wartości te mogą być następnie użyte do wysłania do klas, które przyniosą wynik.

Zasadniczo następujący adres URL:http://site.tld/ru/blog/novinka (lub wersja bez '/ru' ) zostaje zamieniony w coś takiego

$parameters = [
   'language' => 'ru',
   'classname' => 'blog',
   'method' => 'latest',
];

Którego używasz tylko do wysyłki:

$instance = new {$parameter['classname']};
$instance->{'get'.$parameters['method']}( $parameters );

.. lub jakaś jego odmiana, w zależności od konkretnej implementacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwiększyć maksymalną liczbę połączeń w MySQL?

  2. Utracono połączenie z serwerem MySQL podczas zapytania

  3. Jak usunąć duplikaty w tabeli MySQL?

  4. PHP do przechowywania obrazów w MySQL czy nie?

  5. Nie można załadować wtyczki uwierzytelniania „caching_sha2_password”