Übersetzungsarray

PHP-Fan

Erfahrenes Mitglied
Hallo,

ich möchte meine Webseite gerne Mehrsprachig anbieten. Dazu habe ich folgende Datenbank:

Code:
name;value_de;value_en

Inhalte würden so aussehen:

Code:
help;Hilfe;Help

Wie bekomme ich das so hin, dass ich via PHP immer das Array erhalte, was ich brauche und somit auf jeder Unterseite bearbeiten kann?

Vielen Dank!
 
Bist du dir ganz sicher, dass du deine Webseite nicht irgendwann um noch eine oder mehr Sprachen erweitern willst? Denn sonst solltest du deine Tabelle normalisieren:

languages
Code:
 id | country | country_code
----+---------+--------------
  1 | german  | de
  2 | english | gb
  3 | french  | fr
 ...
phrases
Code:
 id | value
----+--------------
  1 | hello
  2 | goodbye
  3 | good morning
 ...
translations
Code:
 id | language_id | phrase_id | value
----+-------------+-----------+-----------------
  1 |           1 |         1 | Hallo
  2 |           1 |         2 | Auf Wiedersehen
  3 |           1 |         3 | Guten Morgen
  4 |           2 |         1 | Hello
  5 |           2 |         2 | Goodbye
  6 |           2 |         3 | Good morning
  7 |           3 |         1 | Salut
  8 |           3 |         2 | Au revoir
  9 |           3 |         3 | Bonjour
 ...

PHP-Skript (nicht geprüft)
PHP:
# frei nach Belieben die entsprechende Sprache definieren
$language = 'de';
$phrases  = array();

# SQL-Abfrage
$sql = 'SELECT
          `translations.value` AS `value`,
          `phrases.value`      AS `key`
        FROM
          translations AS t
        LEFT JOIN phrases p
          ON `t.phrase_id` = `p.id`
        LEFT JOIN languages l
          ON `t.language_id` = `l.id`
        WHERE `l.country_code` = "{$language}"';

# Verbindungskram zur Datenbank samt Abfrage ..

# Werte ihren entsprechenden Schlüsseln zuweisen
while($row = mysql_fetch_row($result)) {
  $phrases[$row['key']] = $row['value'];
}

# Text definieren
$text = '{hello} tutorials.de!';
$text = preg_replace_callback('/\{([[:alnum:]]+)\}/', function ($match) use ($phrases) {
  return $phrases[$match[1]];
}, $text);

# $text enthält jetzt den übersetzten Text in der ausgewählten Sprache
 
PHP:
...
# Text definieren
$text = '{hello} tutorials.de!';
$text = preg_replace_callback('/\{([[:alnum:]]+)\}/', function ($match) use ($phrases) {
  return $phrases[$match[1]];
Kann auch durch ein einfaches Script ersetz werden
PHP:
$text="{$phrases['hello']} tutorials.de!";
 
Also, auf Gefahr hin, das ich hier gesteinigt werde:

Ich würde empfehlen, dass du dir Sprachdateien bastelst. Eine Datenbank halte ich dafür für ungeeignet, weil die ganzen Verknüpfungen ect. doch sehr auf die Performance gehen. Bei mir, waren es bei gut 1500 "Wörtern / Sätzen" deutlich spürbar, ob er nun immer die DB öffnet, alle Zeilen ausliest, ein Array erstellt und dann weiter arbeitet - oder nur einfach eine Datei, Zeilenbasiert öffnet.

Ein Beispiel:
PHP:
$sprache = file($datei);

Die $datei ist dann einfach pro Zeile ein Wort / Satz

Eine weitere Sprache legst du einfach mit einer neuen Datei an.
So musst du einfach jede Zeile der Dateien den gleichen "Inhalt" geben.

DATEI DE, DATEI EN
Ja, Yes
Nein, No
Hilfe, Help
..., ...

Gruß
paD
 
PHP:
...
# Text definieren
$text = '{hello} tutorials.de!';
$text = preg_replace_callback('/\{([[:alnum:]]+)\}/', function ($match) use ($phrases) {
  return $phrases[$match[1]];
Kann auch durch ein einfaches Script ersetz werden
PHP:
$text="{$phrases['hello']} tutorials.de!";
Ich denke, crack denkt da mehr an Templates, die aus der Datenbank oder aus Dateien kommen, in welchen sich mehrere dieser Sprachplatzhalter befinden und eben nicht nur ein solch kleiner String in einer PHP-Datei.

Gruß
 
Zurück