Předpoklad tématu
Vícejazyčný web má tři různé aspekty:
- překlad rozhraní
- obsah
- směrování adres URL
I když jsou všechny propojeny různými způsoby, z pohledu CMS jsou spravovány pomocí různých prvků uživatelského rozhraní a jinak uloženy. Zdá se, že jste si jisti svou implementací a pochopením prvních dvou. Otázka se týkala druhého aspektu – "Překlad adres URL? Měli bychom to udělat nebo ne? a jakým způsobem?"
Z čeho lze vytvořit adresu URL?
Velmi důležitá věc je, nebuďte rádi s IDN . Místo toho upřednostněte přepis (také:transkripce a romanizace). I když se na první pohled IDN zdá být životaschopnou možností pro mezinárodní adresy URL, ve skutečnosti nefunguje tak, jak je inzerováno ze dvou důvodů:
- Některé prohlížeče změní znaky mimo ASCII jako
'ч'
nebo'ž'
do'%D1%87'
a'%C5%BE'
- Pokud má uživatel vlastní motivy, písmo motivu pravděpodobně nebude obsahovat symboly pro tato písmena
Ve skutečnosti jsem se pokusil o přístup IDN před několika lety v projektu založeném na Yii (hrozný rámec, IMHO). Narazil jsem na oba výše uvedené problémy, než jsem toto řešení seškrábal. Také mám podezření, že by to mohl být vektor útoku.
Dostupné možnosti ... jak je vidím já.
V zásadě máte dvě možnosti, které lze abstrahovat jako:
-
http://site.tld/[:query]
:kde[:query]
určuje výběr jazyka i obsahu -
http://site.tld/[:language]/[:query]
:kde[:language]
část URL definuje volbu jazyka a[:query]
se používá pouze k identifikaci obsahu
Dotaz je Α a Ω ..
Řekněme, že vyberete http://site.tld/[:query]
.
V takovém případě máte jeden primární zdroj jazyka:obsah [:query]
segment; a dva další zdroje:
- hodnota
$_COOKIE['lang']
pro tento konkrétní prohlížeč - seznam jazyků v záhlaví HTTP Accept-Language
Nejprve musíte dotaz přiřadit k jednomu z definovaných vzorů směrování (pokud je vaším výběrem Laravel, pak přečtěte si zde ). Po úspěšné shodě vzoru pak musíte najít jazyk.
Museli byste projít všechny segmenty vzoru. Najděte potenciální překlady pro všechny tyto segmenty a určete, který jazyk byl použit. Dva další zdroje (cookie a hlavička) by byly použity k vyřešení konfliktů směrování, pokud (nikoli „pokud“) nastanou.
Vezměte si například:http://site.tld/blog/novinka
.
To je přepis "блог, новинка"
, což v angličtině znamená přibližně "blog", "latest"
.
Jak jste si již mohli všimnout, v ruštině bude „блог“ přepsáno jako „blog“. Což znamená, že pro první část [:query]
vy (v nejlepším případě ) skončí s ['en', 'ru']
seznam možných jazyků. Pak vezmete další segment - "novinka". To může mít na seznamu možností pouze jeden jazyk:['ru']
.
Pokud seznam obsahuje jednu položku, jazyk jste úspěšně našli.
Ale pokud skončíte se 2 (příklad:ruština a ukrajinština) nebo více možností .. nebo 0 možností, podle případu. K nalezení správné možnosti budete muset použít cookie a/nebo záhlaví.
A pokud vše ostatní selže, vyberete výchozí jazyk webu.
Jazyk jako parametr
Alternativou je použití adresy URL, kterou lze definovat jako http://site.tld/[:language]/[:query]
. V tomto případě při překladu dotazu nemusíte hádat jazyk, protože v tu chvíli již víte, který použít.
Existuje také sekundární zdroj jazyka:hodnota cookie. Zde však nemá smysl se zahrávat s hlavičkou Accept-Language, protože v případě "studeného startu" (když uživatel poprvé otevře web s vlastním dotazem) se nezabýváte neznámým množstvím možných jazyků.
Místo toho máte 3 jednoduché možnosti s prioritou:
- pokud
[:language]
segment je nastaven, použijte jej - pokud
$_COOKIE['lang']
je nastaveno, použijte jej - použít výchozí jazyk
Když máte jazyk, jednoduše se pokusíte přeložit dotaz, a pokud se překlad nezdaří, použijte pro daný segment „výchozí hodnotu“ (na základě výsledků směrování).
Není zde třetí možnost?
Ano, technicky můžete oba přístupy kombinovat, ale to by celý proces zkomplikovalo a vyhovovalo by to pouze lidem, kteří chtějí ručně změnit URL adresy http://site.tld/en/news
na http://site.tld/de/news
a očekávejte, že se stránka se zprávami změní na němčinu.
Ale i tento případ by se dal pravděpodobně zmírnit pomocí hodnoty cookie (která by obsahovala informace o předchozí volbě jazyka), což by bylo možné implementovat s menší magií a nadějí.
Jaký přístup použít?
Jak jste již možná uhodli, doporučil bych http://site.tld/[:language]/[:query]
jako rozumnější možnost.
Také v reálné situaci byste měli v URL 3. hlavní část:"title". Jako v názvu produktu v e-shopu nebo v titulku článku na zpravodajském webu.
Příklad:http://site.tld/en/news/article/121415/EU-as-global-reserve-currency
V tomto případě '/news/article/121415'
by byl dotaz a 'EU-as-global-reserve-currency'
je titul. Čistě pro účely SEO.
Lze to udělat v Laravelu?
Trochu, ale ne ve výchozím nastavení.
Moc se v tom nevyznám, ale z toho, co jsem viděl, Laravel používá jednoduchý mechanismus směrování založený na vzorech. Chcete-li implementovat vícejazyčné adresy URL, pravděpodobně budete muset rozšířit základní třídy , protože vícejazyčné směrování vyžaduje přístup k různým formám úložiště (databáze, mezipaměti a/nebo konfigurační soubory).
Je to směrováno. Co teď?
Výsledkem toho všeho byste dostali dvě cenné informace:aktuální jazyk a přeložené segmenty dotazu. Tyto hodnoty pak mohou být použity k odeslání do třídy (tříd), které vytvoří výsledek.
V podstatě následující URL:http://site.tld/ru/blog/novinka
(nebo verze bez '/ru'
) se změní na něco jako
$parameters = [
'language' => 'ru',
'classname' => 'blog',
'method' => 'latest',
];
Který právě používáte pro odeslání:
$instance = new {$parameter['classname']};
$instance->{'get'.$parameters['method']}( $parameters );
.. nebo nějakou jeho variaci, v závislosti na konkrétní implementaci.