Autor Zpráva
Neas
Profil
ahoj.
řeším malý problém: rád bych na stránky dal možnost nastavit si jazyk, ve kterém by chtěl uživatel stránky mít, avšak aby tato lokalizace moc nezpomalovala stránku. Četl jsem o možnosti gettext(), avšak jestli jsem to dobře pochopil, tato metoda lokalizuje stránky vždy jen do toho jazyka, ve kterém bude mít uživatel nastavený prohlížeč (nebo systém, teď nevím). Já bych ale rád, aby uživatel měl na vybranou (osobně znám spoutu lidí, co některé stránky prohlížejí záměrně v angličtině, či jiných jazycích, ať už za účelem se jazyk lépe naučit, nebo za jiným účelem).
Zatím svůj problém řeším pomocí konstant, ale nevím, jak je to tady s tou výkonností a zda neexistuje lepší řešení:
<?php
switch($_GET['lang']) // v budoucnu přes cookies nebo v případě přihlášených uživatelů přes db
{
  case 'cs':
    define('TITLE', 'čeština');
    define('this_text_is_in_english', 'tento text je česky');
    define('hello_there', 'ahoj tam!');
    break;
  case 'en':
    define('TITLE', 'english');
    define('this_text_is_in_english', 'this text is in english');
    define('hello_there', 'hello there!');
    break;
  case 'jp':
    define('TITLE', '日本語');
    define('this_text_is_in_english', 'この字は日本語で書きかれてる');
    define('hello_there', '今日は、そこの人!');
    break;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    <title><?php echo TITLE; ?></title>
  </head>
  <body>
    <?php echo this_text_is_in_english.'<br>'.hello_there; ?>
  </body>
</html>

(konstanty pojmenovávám podle anglického textu - jindy asi jen podle části textu - kvůli lepší přehlednosti >> lepší v textu vidět hello_there než TEXT_23)
Děkuji za rady
Alphard
Profil
Gettext spolupracuje s funkcemi např. setlocale(), s tímhle jsem moc nepracoval, ale mělo by to jít nastavít.
Jako robustní řešení se vytváří i různé komponenty, které umožňjí překlad přímo ze stránce, můžete se podívat, jak to lze dělat na Nette.

To vaše řešení je klasický přístup, kdy se vybere proměnná, která se použije. Ale nedefinoval bych tolik konstant a tak dlouhý switch(). S výhodou můžete využít třeba i vícerozměrného pole. Např.
$lang = array(); // translation
$lang['title'] = 'Diskuse Jak psát web';
$lang['user']['hello'] = 'Dobrý den, pane ';
Tímto způsobem vytvořit několik souborů, vždy s proměnnou $lang, jen jinými překlady a potom

include "tranlation/$_GET[lang].php"; // tohle je typická zranitelnost neošetřeného include, ale teď to nechci komplikovat
echo $lang['title'];

Tuto metodu lze pak různě vylepšovat
function t($key, &$lang, &$default)
{
  if (!empty($lang[$key])
  {
    return $lang[$key];
  }
  return $default[$key];
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0