Überladene Methode - "Sprachweiche"

ZodiacXP

Erfahrenes Mitglied
Sodelä.
Rumgebastelt an einer Klasse zum Übersetzen und schon das Herausfinden der geeignetsten Sprache brauch 3 Bildschirmseiten.

Wenn eine Sprache schon übergeben wurde (von $_SESSION["langID"] oder so) wird diese direkt verwendet. Ansonsten:
  1. Alle Browsersprachen in ein Array
  2. Sprachen mit "-" zusätzlich trennen
  3. "Qualität" zum Spracharray hinzufügen
  4. In SQL-Tabelle nachsehen welche "Übersetzungen" vorhanden sind
  5. Die beste (Qualitätsvergleich) verwenden / ID merken

Hat jemand andere Varianten oder einen Verbesserungsvorschlag?

PHP:
/**
 * LICENSE: This source file is subject to
 * "Attribution-Noncommercial-Share Alike 3.0 Unported" license
 * that is available through the world-wide-web at the following URI:
 * http://creativecommons.org/licenses/by-nc-sa/3.0/
 * If you did not receive a copy of the license and are unable to
 * obtain it through the web, please send a note to zodiacxp@web.de
 * so I can mail you a copy.
 * Put this always visible and reachable on your page:
 * Translation-Class 1.0.0 (c) ZodiacXP
 *
*/

class Translation
{
  public $iLanguageID = NULL;

  public $iSQL = 0;  // Query-Counter

  private $rSQL;	// SQL-Resource

  function __construct($rSQL, $iLanguageID = NULL)
  {
    $this->rSQL = $rSQL;

    if ($iLanguageID != NULL)
    {
      $this->iLanguageID = $iLanguageID;
    }
    else
    {
      // Wenn Browser keine Sprache anbietet "Deutsch" nehmen
      if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE']))
      {
        $aLanguages = array('de' => 1);
      }
      else {
        // Alle Browsersprachen in ein Array
        $a = preg_split('/,\s*/', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
        foreach ($a as $s)
        {
          // Qualität etc herausfinden
          preg_match ('/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $s, $aLanguage);

          // Sprachen mit "-" zusätzlich trennen
          if (strpos($aLanguage[1], "-"))
          {
            $key = substr($aLanguage[1], strpos($aLanguage[1], "-")+1);
          }
          else
          {
            $key = $aLanguage[1];
          }

          // Wenn keine Qualität vorhanden einfach 1 setzen
          if (!$aLanguage[2])
          {
            $aLanguage[2] = 1;
          }

          // "Qualität" zum Spracharray hinzufügen
          if ($aLanguages[$key] < $aLanguage[2])
          {
            $aLanguages[$key] = (float) $aLanguage[2];
          }

        }
      }
      $fQuality = (float) 0.0;

      // In SQL-Tabelle nachsehen welche "Übersetzungen" vorhanden sind
      $s = "
        SELECT `languageID`, `languageTag`, `dateFormat`
        FROM `languages`
        WHERE `languageTag` = '" . join("' OR `languageTag` = '", array_keys($aLanguages)) . "'"
      ;
      $hSQL = mysql_query($s, $rSQL);

      // Die beste (Qualitätsvergleich) verwenden
      while ($a = mysql_fetch_row($hSQL) )
      {
        if ($fQuality < $aLanguages[$a[1]])
        {
          // ID merken
          $this->iLanguageID = $a[0];
          $fQuality = $aLanguages[$a[1]];
        }
      }

      mysql_free_result($hSQL);
    }
  }
}
 
Ich persoenlich finde GetText sehr angenehm zur internationalisierung von Programmen, PHP-Scripts inklusive.

Der Vorteil dabei ist dass man sich jegliche Programmiererei sparen kann und output statt einfach per echo ueber echo gettext() regelt.
Also statt:
PHP:
echo 'Hello world!';
einfach
PHP:
echo gettext('Hello world!');

Die so markierten Texte kann man spaeter aus dem Code extrahieren und dann uebersetzen. Den Rest uebernimmt dann, mit nur wenig zusaetzlichem Code, GetText.

Auch sehr nett ist bei dieser Methode ist dass, falls der Server mal kein GetText unterstuetzt man im Grunde immer noch die Moeglichkeit zu einem Fallback hat.

Entweder man macht es wie ich einfach mit einem Dummy
PHP:
if (!function_exists('gettext'))
{
 function gettext($message)
 {
  return $message;
 }
}
oder aber codet sich seine eigene Version von gettext() die dann auf jede erdenkliche Art und Weise uebersetzte Strings liefern kann.

Wer will kann natuerlich auch mit einem Wrapper arbeiten und diesen anstelle von gettext() nutzen.
 
Interessante Sache.
Hör ich zum ersten mal von.
Hast du auch das Eclipse-Plugin http://www.gted.org/ ? ?

Ich komm damit nicht ganz klar. Hab kein Plan ob der die .mo von selbst erstellt oder nicht und wie ich da eine neue Übersetzung Eintrag, so dass er direkt mit dem richtigen Template / der richtigen PHP verbunden ist etc.
 
Mit diesem Plugin arbeite ich nicht.
Ich nutze xgettext in der Shell um die Strings zu extrahieren und dann KBabel um die Uebersetzungen zu erstellen.
 
Also mit dem Plugin ist es ganz bequem. Rechtsklick auf den Projektordner und ganz unten im Menü kann man sich die .pot/.po und .mo erstellen lassen. Er ruft selbst im Hintergrund die xgettext auf usw.

Einmal brauch ich aber noch Hilfe. Die po und php im Projekt:

_content/translation/de_DE/LC_ALL/messages.mo (Hier als .po ohne Header):
Code:
#: _content/index.php:83
msgid "Hello world"
msgstr "Hallo Welt"

#: _content/index.php:85
msgid "Goodbye"
msgstr "Auf Wiedersehen."

_content/index.php (Auszug):
PHP:
setlocale(LC_ALL, "de_DE");

bindtextdomain("messages", "translation/");  // läuft unter Windows
bind_textdomain_codeset("messages", "UTF-8");

textdomain("messages");

echo _("Hello world");
echo "<br />";
echo gettext("Goodbye");

Und in der php.ini wird die gettext.dll auch geladen.

Aber ich erhalte keine Übersetzung. Selbst wenn bei bindtextdomain der slash weggelassen wird.
 
Zurück