PHP: Zwischen Sprachen wechseln?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

wie ich es machen würde (und mit sicherheit werden das auch viele andere so in der art machen):

ein eigenes system für lokalisation bauen. heißt eine eigene klasse die die ganze arbeit für dich erledigt was das laden der strings in korrekter sprache angeht.

diese klasse nutzt du dann einfach auf jeder seite die übersetzt werden muss.

die lokalisations klasse überprüft dann im konstruktor welche sprache geladen werden muss. an jeder stelle in deiner html/php seite wo dann ein string übersetzt werden muss rufst du dann eine methode der lokalisationsklasse auf. diese methode läd dann aus einer datenbank/datei den entsprechenden string.

bin nicht so wirklich in php drin deswegen hier mal nur etwas pseudo php wie das in etwa aussehen würde

die klasse fürs übersetzen

<?php
  class Localizator {
    private $lang;

    function __construct() {
      //Lang tag aus header auslesen/setzen und in $lang speicher
    }

    function get($varName) {
      switch($lang) {
        case 'de':
          //string $varName aus datei/db mit deutschen strings laden
          break;
        case 'en':
          //string $varName aus datei/db mit englischen strings laden
          break;
      }
      return $translatedString
    } 
  }
?>

und in der html seite

...
<?php
  $loc = new Localizator();
?>

<h1><?php $loc->get('headerMain') ?></h1>

keine garantie auf korrektheit/funktion des codes, sollte aber reichen für eine ungefähre idee wie man das lösen könnte.

Woher ich das weiß:Studium / Ausbildung – Softwareentwickler, B. Sc. Informatik

korbi27 
Fragesteller
 09.10.2019, 00:38

Cool! Objektorientiert ist immer nett!

Ich glaube ich baue einen an dein Beispiel angelehnten 'Language Controler'.

Je nach Sprache wird dann wie von threadi erwähnt ein Array mit Schlüssel (der bei en/de den gleichen Namen hat) und Wert in verschiedenen Sprachen returned.

Danke!

1

Nun genau wegen so Problemen nutzt man i.d.R. einen FrontController bzw. hat einen einzigen Einsprungspunkt, die index.php. Von dort aus kann man dann einige Sachen steuern, die für alle geladenen Inhalte gelten. Ansonsten solltest du mal nach den Begriffen i10n und i18n suchen was diese Themen angeht. PHP hat diesbezüglich auch schon eine Implementation von gettext an Bord.

Am GET würde ich das nicht in allen Fällen abhängig machen, sondern mir merken, anstatt dieses dauernd mitzuschleppen. Sei es in der SESSION oder sofern es User gibt an deren Einstellungen. Natürlich kann man über entsprechende IP Bereiche auch schon eine Defaultsprache anzeigen, die wahrscheinlich stimmt.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

regex9  09.10.2019, 08:50

Da es hier ja nur um eine Sprachauswahl geht, würde ich mich für die Bestimmung einer Standardsprache vorzugsweise an der Browsereinstellung orientieren.

1

Alle Texte musst Du in jedem Fall dynamisch gestalten - nichts sollte irgendwo fest stehen. Um sie zu verwalten gibt es enorm viele Möglichkeiten. Im einfachsten Fall ist es ein PHP-Array pro Sprache wobei der Key dem Textplatzhalter entspricht. Beispiel:

$lang["de"] = array( "text1" => "Beispiel" );
$lang["en"] = array( "text1" => "Example" );

Ausgabe:

echo $lang[$_GET["lang"]]["text1"];

Die aktuelle Sprache würde ich empfehlen in der PHP-Session zu speichern. Dann musst du sie nicht in allen URLs mitschleifen.

Ausführlicher geht das natürlich auch mit anderen Dateiformaten. Hilfreich ist z.B. eine PO-Datei. Die kann man in Editoren wie POEdit auch übersichtlich bearbeiten.

Woher ich das weiß:Berufserfahrung

Babelfish  09.10.2019, 00:01

Die Sprache in einer Session zu speichern ist ungünstig. Dann bekommen nämlich Suchmaschinen nur eine Sprache zu Gesicht und nur die wird indiziert. Auch lassen sich keine Links auf eine bestimmte Sprache setzen.

Üblich ist es die Sprache in der URL am Anfang zu setzen: example.net/de/seite

Das wird dann per URL-Rewrite intern bspw. auf eine zentrale index.php umgeleitet und in dem Script stehen dann die Sprache und restliche URL per GET zur Verfügung. Der Inhalt wird dann danach zusammengebaut.

1

Eigentlich gäbe es hierfür Content-Negotiation.

Uneigentlich lässt sich das aber nur mäßig gut mit PHP zusammenbringen.

Strukturell ist natürlich das Übersichtlichste, die Sprachnegotiation zentral in eine Datei zu packen, die Du immer einbindest, das bewahrt Dich vor Duplikation und Inkonsistenzen.

Die Inhalte der jeweiligen Datei werden dann sprachgesteuert über l10n nachgezogen (inklusive Fallback-Mechanismus).

Aber so richtig optimal ist das eben auch nicht.

Doch, mit include oder require kannst du das schon machen. Egal ob mit Klassen (was abstrakte Programmierung wäre) oder ohne: Es werden immer Files mitgeladen, ob nun per include/require oder autoload (was aber noch andere Parameter voraussetzt.

Hier eine simple Lösung für den Anfang(!). Nach und nach solltest du dich mit Frameworks wie z.B. Lumen (ein Leichtgewicht) beschäftigen, die dir viel Arbeit abnehmen.

if (isset($_GET['lang']) && $_GET['lang'] == 'de) {

   $lang = 'de';
   $langFile = 'deutsch.php';

} else {

  $lang = 'en';
  $langFile = 'englisch.php';
}

$contentFolder = 'inhalte/';
$serverRoute = $_SERVER['DOCUMENT_ROOT'] . $contentFolder . $langFile;

if (file_exists($serverRoute)) {
    include($serverRoute);
} else {
   header('HTTP/1.0 404 Not Found');
   exit('File not found!');
}