Avatar
mikolasjak
Člen
Avatar
mikolasjak:

Pekný deň prajem, mám otázku..
Pracujem na vlastnom CMS, ale neviem ako efektívne poriešiť viac jazyčnú stránku. To jest, že v administrácií si môže užívateľ preložiť všetky výstupy (stránky, články, menu,...).
Problém: všetky výstupy sa budú dať preložiť aspoň do 10 jazykov. Ale pridávať do databáze (napr. table pages) column-y ako "sk_text", "fr_text", "en_text",..., mi príde veľmi neefektívne. Nepoznáte niekto lepšie riešenie ?
Dúfam, že som to zložito nevysvetlil :D ďakujem za odpovede

 
Odpovědět 27.3.2015 17:38
Avatar
Odpovídá na mikolasjak
Martin Konečný (pavelco1998):

Podle mě je nejlepší si ukládat klíče a pro ně podle jazyka vyhledat text.

Např. tabulka v DB bude

translation (
  id INT PK AI,
  language_id,
  page VARCHAR  -- název stránky,
  key  -- klíč pro daný kousek textu,
  text  -- textový obsah pro daný jazyk
)

Na webu pak texty vyhledáš třeba takto:

$language = $_GET["language"];
$page = $_GET["page"];

$textsQuery = $pdo->prepare("
  SELECT `key`, `text`
  FROM `translation`
  WHERE `language_id` = ? AND `page` = ?
");
$textsQuery->execute(array($langauge, $page));
$texts = $textsQuery->fetchAll(PDO::FETCH_OBJ);

A na stránce je pak vypíšeš takto:

<h1><?php echo $texts->heading; ?></h1>
<p><?php echo $texts->paragraph; ?></p>

<a href="?page=admin"><?php echo $texts->linkAdmin; ?></a>

Já teď v projektu s Nette používám Kdyby\Translation, viz https://github.com/…/Translation

 
Nahoru Odpovědět 27.3.2015 17:53
Avatar
Martin Konečný (pavelco1998):

Tento způsob nebude logicky fungovat v případě, že stránky budou vytvářet sami uživatelé (např. nějaké články na blogu), ale pouze, pokud budou stránky na webu napevno určené.

Ještě jedna věc. Pokud bys potřeboval část textu staticky a část dynamicky (např. věta "Vaše přihlašovací jméno je __tvé jméno__), pak se to dá řešit pomocí zástupných znaků a formátovacích funkcí (printf, sprintf apod.).
Např.

// klíč a hodnota v databázi
nameInfo: Vaše přihlašovací jméno je %s.

// na stránce
<p><?php echo sprintf($texts->nameInfo, $user->name); ?></p>

Pomocí sprintf() se zástupný znak %s nahradí hodnotou proměnné $user->name.

Editováno 27.3.2015 17:57
 
Nahoru Odpovědět 27.3.2015 17:57
Avatar
mikolasjak
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
mikolasjak:

Ďakujem ti za možné riešenie. Každopádne, keď som nad tým premýšlaľ, zrejme nastavím len pár jazykových verzií. To už nebude problém potom dosadiť do tabuľky pár políčok navyše.. Ale aj tak, ešte raz ďakujem.

 
Nahoru Odpovědět 27.3.2015 18:57
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na mikolasjak
patrik.valkovic:

Pokud máš pevně dané jazyky, tak bych (jak říkáš) vytvořil pro každý jazyk samostatný sloupec. Pokud by jsi chtěl robustnější řešení, tak bych udělal tabulku jazyků, tabulku s klíči (které budou použity v PHP kódu) a tabulky překladu následovně

translation(
language: int
text: int
translation: text

kde by byl "language" navázaný na tabulky jazyků a "text" na tabulku s klíči.

Prakticky by to znamenalo že počet záznamů by se rovnal počtu jazyků * počet textů k přeložení. Zatížíš více databázi.

Další nápad by byl samostatný soubor pro každý jazyk popřípadě pro každou stránku. Hodně záleží na složitosti a kvantitě textů.

Nahoru Odpovědět 27.3.2015 19:11
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.