Sprachdateien

Sancheck

Legendäres Mitglied
Wie realisiert ihr diese in php?
mittels require einbinden?

Und schreibt ihr die eintraege dann in eine Datenbank oder Wie macht ihr das?

Ich plane ein Skript zu schreiben, das ich konzeptioniert habe und will mir die Multilingualisierung ermoeglichen.
 
Statische Vokalbeln bind ich als Array mit allen Vokabeln in einer php-Datei per include ein.

Bei Neueinträgen durch Mitglieder, die mehrsprachig sein können, wird der 1. Eintrag in allen Sprachen gespeichert.
Dann steht der Eintrag wenigstens problemlos in der Orginalsprache zur Verfügung auch wenn dieser nicht übersetzt wurde.
Bei weiteren Übersetzungen wird dann die spezielle Sprachdatei, bzw. der mysql-Eintrag aktualisiert.

Grüsse

Tümmel
 
In den meisten Projekten mache ich eine String-Datei zurecht, die nichts anderes ist als eine PHP-Datei mit einem Array an Strings. Diese wird dann einfach je nach Sprache inkludiert.
 
QUOTE Danke fuer deine Idee!
Gibts ne fertige funktion.....


laugh.gif

fopen($file,"w");fputs($text);fclose($file);

Schau mal beiphp.net unter fopen.
Da gibt's ne ganze Reihe fertiger Funtkionen.
 
Danke fuer die aeusserst hilfreiche antwort *sarkasmus*

ich dachte an ne languagelib etc.
 
Ich weiß ich bin mal wieder umständlich, aber ich mache das so:

(die fehlenden Properties und Funktionen einfach dazudenken, wollte jetzt nicht alles hier rein kopieren. Der Sinn sollte klar sein)

CODE
class PXConfig
{
private function initLanguage() {
   $allowedLanguages = array(
    "de-DE" => "Language_deDE",
    "en-US" => "Language_enUS");

   if(!array_key_exists($this->_DefaultLanguage, $allowedLanguages)) {
     $this->_DefaultLanguage = "de-DE";
   }
   $languageClass = $allowedLanguages[$this->_DefaultLanguage];
   $languageFile = sprintf("%slang/%s.inc", FORUM_PATH, $languageClass);
   if(!file_exists($languageFile)) {
     throw(new Exception("Language file not found", -1));
   }

   require_once($languageFile);
   $refClass = new ReflectionClass($languageClass);
   $this->_PXLanguage = $refClass->newInstance();
 }
}

class PXLanguage
{
 /** Exceptions **/
 const EXCEPTION_DBHOST = 1000;
 const EXCEPTION_DBDATABASE = 1001;
 const EXCEPTION_DBUSERNAME = 1002;
 const EXCEPTION_DBPASSWORD = 1003;
 const EXCEPTION_DBTYPE = 1004;
 const EXCEPTION_DBTYPEFILE = 1005;
 
 protected /* array */ $_Texts = array();
 protected /* array */ $_Exceptions = array();

 public function getText($Code) {
   if(array_key_exists($Code, $this->_Texts)) {
     return $this->_Texts[$Code];
   }
   if(array_key_exists($Code, $this->_Exceptions)) {
     return $this->_Exceptions[$Code];
   }  
   return "<!-- PXL: $Code not found-->";
 }
}

Sprachdatei:
class Language_deDE extends PXLanguage
{
 public function __construct() {
   parent::__construct();
   $this->_Exceptions = array(
    1000 => 'DB Host nicht gesetzt',
    1001 => 'DB Datenbank nicht gesetzt',
    1002 => 'DB Benutzername nicht gesetzt',
    1003 => 'DB Passwort nicht gesetzt',
    1004 => 'DB Type nicht gesetzt',
    1005 => 'DB Type Klasse wurde nicht gefunden'
   );
 }
}



Vorteil: Ich bin objektorientiert, Ich kann im Quelltext per Konstanten auf die Texte zugreifen
Nachteile: PHP5 + OOP = angeblich (nicht selbst getestet) nicht so perfomant, keine Datenbankverwaltung dahinter, daher viel Pflegearbeit. Einfacher wäre eine Datenbank und das automatische Erstellen der Sprachdateien.

Die Konstanten und mehreren Arrays in PXLanguage könnte man sich sparen, aber ich fand sie praktischer.

BTW, der Quellcode ist noch nicht getestet *hust*

Ansonsten gibt es noch http://de.php.net/gettext , was ganz gut sein soll... aber habe ich noch nicht selber ausprobieren können.
 
Ein Problem (was ich aber irgendwie immer habe) sind Texte in denen sich der Satzbau in den verschiedenen Sprachen gravierend unterscheidet und benutzerdefinierte Variablen eingebaut werden sollen.

Hallo yosh, wie geht's?
Hello yosh, how are you?

Kein Problem, ein Textteil "Hallo" und einer "wie geht's", dazwischen den Namen.

Sinnvoller wäre es "Hallo $NAME, wie geht's" und "Hello $NAME, how are you" einzutragen und der getText-Funktion noch ein Array mit Parametern zu übergeben. Mach ich mal falls ich wieder an den Code muss *g*
 
QUOTE (Yosh @ Mo 28.07.2008, 15:15) Ein Problem (was ich aber irgendwie immer habe) sind Texte in denen sich der Satzbau in den verschiedenen Sprachen gravierend unterscheidet und benutzerdefinierte Variablen eingebaut werden sollen.

Hallo yosh, wie geht's?
Hello yosh, how are you?

Kein Problem, ein Textteil "Hallo" und einer "wie geht's", dazwischen den Namen.

Sinnvoller wäre es "Hallo $NAME, wie geht's" und "Hello $NAME, how are you" einzutragen und der getText-Funktion noch ein Array mit Parametern zu übergeben. Mach ich mal falls ich wieder an den Code muss *g*

Warum erfinden wir das Rad nicht gleich nochmal neu?
PHP bietet gettext-Unterstützung, des weiteren lässt sich ja einfach printf verwenden.

Zum Thema Arrays: Wenn man alle übersetzten Strings für ne größere Seite in einem Array speichert, das jedes mal geladen wird, viel Spaß. PHP saugt massig Speicher für Arrays.
 
QUOTE (Yosh @ Mo 28.07.2008, 15:03) Ansonsten gibt es noch http://de.php.net/gettext , was ganz gut sein soll... aber habe ich noch nicht selber ausprobieren können.


Wie gesagt, noch nicht probiert, aber rein aus Interesse, ist Dir bekannt ob gettext auch mit IIS vereinbar ist oder nicht?

[edit]
Hat sich erledigt, habe einen Hoster gesehen der es anbietet, also wirds wohl ohne weiteres möglich sein
ohmy.gif
 
Hi Sancheck,

Wenn du zu faul zum Lesen bist:

Ne Programmierer kostet 100 Euro/ Stunde. Du hast keine 100 Euro?
Es gibt in Deutschland Sozialhilfe. Oder geh betteln,...2 Tage betteln und du bekommst die 100 Euro die du brauchsd....


QUOTE Ich weiß ich bin mal wieder umständlich


Kannst du mir mal erklären wozu du das array allowed_languages definierst?
Die erlaubten Werte sind in den Schlüsseln gespeichert und die Werte sind eine andere Schreibweise der Schlüssel.

Wo ist die Mehrwert in der zusätzlichen Arbeit?

 
Das hat nur den Sinn dass ich den Klassen andere Namen geben kann als de_DE usw.
Außerdem ist so abgesichert, dass nur Klassen initialisiert werden die ich intialisieren will.

Die Klasse PXconfig wird bei mir noch abgeleitet und da kann ein Benutzer der das installiert sonstwas angeben... aber wie gesagt, das Script ist nie zum Einsatz gekommen
 
Zurück
Oben