• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

produktives Mehrsprachsystem

djfabi

Mitglied
Hallo,

ich habe bei einem aktuellen Projekt (etwas größer) vor es in mehreren Sprachen anzubieten.

Nur nun weiß ich nicht so ganz genau, wie es am schlauesten ist.

Ich hatte vor, in PHP ($) Variabeln zu erstellen und es dann mit echo auszugeben, und aber vorher eine jeweils andere Sprachdatei zu laden.
Mit dem jeweils für die Sprache entsprechenden Wert.

Nur das ist ziemlich Variabeln fressend (zu viele) und ziemlich unübersichtlich etc..


Gibt es einen Weg das effektiver & produktiver zu gestalten?

Wie macht ihr denn immer eure Seiten, wenn ihr sie in mehren Sprachen anbieten wollt?

(ich möchte aber schon gerne selber übersetzen, nicht irgentwie Google Übersetzer in die Seite einbauen (o.Ä.) , finde ich wirkt nicht so proffessionell)

Gruß
 
Werbung:
Ich mache es eigentlich immer so, dass die Inhalte und die Texte von verschiedenen Dateien geladen werden. Es werden aber nicht gleich alle Texte geladen, sondern nur die benötigten. Je nach eingestellter Sprache werden andere Dateien für die Texte geladen. Die Texte hab ich dabei im JSON-Format gespeichert und wende dann noch ein extract() darauf an, um sie einfacher verwenden zu können (damit es nicht so unübersichtlich wird, kannst per extract() noch ein Präfix z.B. "lang" vor den Variablennamen hängen). Du könntest die Texte aber auch in einer Datenbank speichern. Ist vielleicht schneller
 
Werbung:
Im Web gibt es viele Wege die beschreiben wie man so etwas realisieren kann:
PHP-Einfach.de - Mehrsprachig mittels PHP
Webseiten mehrsprachig programmieren | Peppies-Life – My life is your life

Den Grundgedanken hast Du ja schon erfasst: eine Sprachdatei oder irgendeine Art der Speicherung von den auszugebenden Texten sowie die Ausgabe selbst in Abhängigkeit von der gewählten Sprache des Besuchers.

Ich selbst verwende für solche Seiten meist ein CMS, welches auch Mehrsprachigkeit unterstützt. Das geht heute eigentlich bei jedem "großen" CMS wie Joomla, typo3, auch bei Wordpress. Wie oben beschrieben kann man das aber durchaus auch selbst programmieren.
 
ok, danke für eure schnelle Hilfe.


Nur noch eine Frage: bei zum Beispiel facebook wird, wenn es die Übersetzung im Deutschen noch nicht gibt einfach das Englische Wort genommen. Also entstehen keine Fehler, wenn es in eine Sprache noch nicht übersetzt wurde, und das entsprechende Array/Konstante/Variable nicht vorhanden ist.

Wie wird das dann gemacht? Ich kann mir schlecht vorstellen, das vor JEDER Variable/Array/Konstanten ausgaben eine if() Abfrage mit entsprechenden else Bedingungen gemacht wird.

Wisst ihr da was?
 
Nee ein ganz einfaches Array reicht aus für die Übersetzung. Es werden auch keine Variablen dafür verwendet. Sondern eine fixe Sprache die dann später übers Array in alle anderen Sprachen übersetzt wird hier mal ein Beispiel.
Die Namen mit einen : davor stehen für einen bestimmten Platzhalter. Damit ist es eben auch möglich dynamische ausgaben zu generieren

PHP:
<?php
/**
 * @name de.php
 * 
 * Deutsche übersetzung
 * 
 * @author Splasch
 * @version 0.1
 * @copyright Copyright (c) 2011, Splasch
 */
defined('SYSPATH') or die('No direct script access.');

return array
(
  /* Globale Lang Strings */
  'language'    => 'Sprache',
  'language_de' => 'Deutsch',
  'language_en' => 'Englisch',

  /* Navigation Level 2 (Drop-down menus) */
  'nav_galerie' => 'Galerie',
  'nav_about'   => 'About Edit',
  'nav_logout'  => 'Abmelden',


  /* Navigation Level 3 (Left side Menu) */
  'subnav_album_add'    => 'Album erstellen',
  'subnav_album_delete' => 'Album l&ouml;schen',
  'subnav_album_sort'   => 'Album sortieren',
  'subnav_album_photo'  => 'Album Foto zuweisen',
  'subnav_photo_add'    => 'Fotos hinzuf&uuml;gen',
  'subnav_photo_delete' => 'Fotos l&ouml;schen',
  'subnav_photo_sort'   => 'Fotos sortieren',


  /* Fehlermeldungen */
  ':field must not be empty'                        => ':field darf nicht leer sein',               //not_empty
  ':field must be the same as :param1'              => ':field muss dasselbe sein wie :param1', //matches
  ':field does not match the required format'       => ':field ungültiges Format',                  //regex
  ':field must be exactly :param1 characters long'  => '',                            //exact_length
  ':field must be at least :param1 characters long' => ':field muss mindestens :param1 Zeichen lang sein', //min_length
  ':field must be less than :param1 characters long'=> ':field darf maximal :param1 Zeichen lang sein', //max_length
  ':field must be one of the available options'     => '',  //in_array
  ':field must be a digit'                          => '',                       //digit
  ':field must be a decimal with :param1 places'    => ''  , //decimal
  ':field must be within the range of :param1 to :param2' =>'', //range
  ':field :param1 already exists'                   => ':field :param1 ist bereits vergeben',
  ':field must be at least :param2 characters long' => ':field muss mindestens :param2 Zeichen lang sein',
  ':field must be a email address'                  => ':field muss eine E-Mail-Adresse sein',
  'Invalid picture format are permitted (:param1)'  => 'Ungültiges Bildformat erlaubt sind (:param1)',
  'File name may not be empty'                      => 'Dateiname darf nicht leer sein',
  'First'                                           => 'Erste',
  'Previous'                                        => 'Vorige',
  'Next'                                            => 'N&auml;chste',
  'Last'                                            => 'Letzte',

// Date
  
  'about a week ago'                => 'vor ungefähr einer Woche',
  'less than a month ago'           =>'vor weniger als einem Monat',
  'less than a day ago'             => 'vor weniger als einem Tag',
  'a few minutes ago'               =>'vor ein paar Minuten',
  'moments ago'                     =>'im Momenten',
  'less than an hour ago'           =>'vor weniger als einer Stunde',
)

?>

So in etwa sehen dann die Übersetzung Array aus.
Erläuterung:

Die View werden alle in der Standard Sprache erstellt und später dann über die Übersetzung Array ersetzt. Sollte im Übersetzung Array das Wort oder der Textdialog nicht vorhanden sein so erfolgt keine Übersetzung und die Standard Sprache wird ausgeben.

Mfg Splasch
 
Zuletzt bearbeitet:
Werbung:
danke, kannst du mir noch ein ausgabe Beispiel geben?

Weil, was ist jz wie? :D

PHP:
<?php

include 'de.php';

// und jetzt? 
// sowas: 

echo language;
echo :field must be one of the available options;
echo First;

// ?


?>
 
Du musst schon auch die Übersetzung Methode aufrufen bei der Ausgabe (OOP). Falls du nicht OO verwendest dann eben die Funktion.

Hier noch dein gewünschtes Beispiel einer Ausgabe zum Beispiel die Navigation links einer Webseite.
Nicht wundern bei HTML::anchor() ist nur eine Helper Methode aus einer Hilfs Klasse die dafür sorgt das Html Links ausgeben werden. $name ist der Namens Inhalt des Navigation Array das übersetzt wird über das Sprach Array. $link ist ledig nur der Webseiten link enthalten eben welche Seite aufgerufen werden soll


PHP:
<!-- Navigation item -->
          <ul>
            <li><a href="#">Contentverwaltung<!--[if IE 7]><!--></a><!--<![endif]-->
              <!--[if lte IE 6]><table><tr><td><![endif]-->
                <ul>
              <?  foreach ($nav['navi2'] as $name => $link)
                  {
                    echo '<li>'.HTML::anchor($link, __($name)).'</li>'."\n" ;
                  }
              ?>
                </ul>

Die Navigation Links stehen übrings in den Beispiel auch in einen anderen Array.
Zb so:

PHP:
<?php
/**
 * @name backend-nav.php
 * 
 * Konfiguration Navigation Menü
 * URL::site('')
 * @author Splasch
 * @version 0.1
 * @copyright Copyright (c) 2011, Splasch
 */
defined('SYSPATH') or die('No direct access allowed.');

return array(
 
  /* Navigation Level 2 (Drop-down menus) */
  /* Home */
  'navi1' => array(
  
  ),
                  
  /* Contenverwaltung */
  'navi2' => array(
                    'nav_galerie' => 'backend/galerie',
                    'nav_about'   => 'backend/about',
                    'nav_logout'  => 'backend/login/logout',
  ),
                  
  /* Navigation Level 3 (Left side Menu) */
  'sidemenu_galerie' => array(
                    'subnav_album_add'    => 'backend/galerie/add_album',
                    'subnav_album_delete' => 'backend/galerie/del_album',
                    'subnav_album_sort'   => 'backend/galerie/sort_album',
                    'subnav_album_photo'  => 'backend/galerie/album_photo',
                    'subnav_photo_add'    => 'backend/galerie/add_picture',
                    'subnav_photo_delete' => 'backend/galerie/del_picture',
                    'subnav_photo_sort'   => 'backend/galerie/sort_picture',
  
  )









);

Die Deutsche Übersetzung der eigene Namen bzw. Standard Sprache

PHP:
<?php
/**
 * @name de.php
 * 
 * Deutsche übersetzung
 * 
 * @author Splasch
 * @version 0.1
 * @copyright Copyright (c) 2011, Splasch
 */
defined('SYSPATH') or die('No direct script access.');

return array
(
  /* Globale Lang Strings */
  'language'    => 'Sprache',
  'language_de' => 'Deutsch',
  'language_en' => 'Englisch',

  /* Navigation Level 2 (Drop-down menus) */
  'nav_galerie' => 'Galerie',
  'nav_about'   => 'About Edit',
  'nav_logout'  => 'Abmelden',


  /* Navigation Level 3 (Left side Menu) */
  'subnav_album_add'    => 'Album erstellen',
  'subnav_album_delete' => 'Album l&ouml;schen',
  'subnav_album_sort'   => 'Album sortieren',
  'subnav_album_photo'  => 'Album Foto zuweisen',
  'subnav_photo_add'    => 'Fotos hinzuf&uuml;gen',
  'subnav_photo_delete' => 'Fotos l&ouml;schen',
  'subnav_photo_sort'   => 'Fotos sortieren',


  /* Fehlermeldungen */
  ':field must not be empty'                        => ':field darf nicht leer sein',               //not_empty
  ':field must be the same as :param1'              => ':field muss dasselbe sein wie :param1', //matches
  ':field does not match the required format'       => ':field ungültiges Format',                  //regex
  ':field must be exactly :param1 characters long'  => '',                            //exact_length
  ':field must be at least :param1 characters long' => ':field muss mindestens :param1 Zeichen lang sein', //min_length
  ':field must be less than :param1 characters long'=> ':field darf maximal :param1 Zeichen lang sein', //max_length
  ':field must be one of the available options'     => '',  //in_array
  ':field must be a digit'                          => '',                       //digit
  ':field must be a decimal with :param1 places'    => ''  , //decimal
  ':field must be within the range of :param1 to :param2' =>'', //range
  ':field :param1 already exists'                   => ':field :param1 ist bereits vergeben',
  ':field must be at least :param2 characters long' => ':field muss mindestens :param2 Zeichen lang sein',
  ':field must be a email address'                  => ':field muss eine E-Mail-Adresse sein',
  'Invalid picture format are permitted (:param1)'  => 'Ungültiges Bildformat erlaubt sind (:param1)',
  'File name may not be empty'                      => 'Dateiname darf nicht leer sein',
  'First'                                           => 'Erste',
  'Previous'                                        => 'Vorige',
  'Next'                                            => 'N&auml;chste',
  'Last'                                            => 'Letzte',
)

?>

Daher aus: 'nav_galerie' wird 'Galerie'

Die Standardsprache kann man nun je nach dem welches Übersetzung Array geladen wird auf eine andere Sprache übersetzen.
Erfolgt keine Übersetzung dann wird 'nav_galerie' ausgeben. Also wenn das Wort im Übersetzung Array fehlt dann wird eben das Original ausgeben von der Standardsprache


Mfg Splasch
 
Zuletzt bearbeitet:
Kommt Splasch auch noch dieses Forum zumüllen. Wozu HTML-Entitäten in den Übersetzungen? Lächerlich "Copyright (c) 2011, Splasch"


Warum sollte man nicht gettext benutzen? Wie willst du damit Plural/Singular einführen? Bitte erzähle hier keinen Unsinn.
 
Werbung:
so wie ich das sehe, hat er einfach den Code aus einem anderen (älteren) Projekt kopiert.

Die HTML-Entitäten hätte ich sowieso geändert.

Und was ist an dem Copyright so lächerlich?

Wie willst du damit Plural/Singular einführen?

Was ist damit gemeint?


Naja wir sollten nun hier keine Diskussion anfangen.. Danke Splasch
 
Es ist nur lächerlich, weil Splasch im php.de-Forum so ziemlich der bekannteste Benutzer ist, der aber nur wegen seiner Inkompetenz und seiner hohen Selbsteinschätzung trotz seiner Inkompetenz bekannt ist.

Der Singular und Plural ist eines der Probleme die man beim Übersetzen von Texten haben kann.
 
Es ist nur lächerlich, weil Splasch im php.de-Forum so ziemlich der bekannteste Benutzer ist, der aber nur wegen seiner Inkompetenz und seiner hohen Selbsteinschätzung trotz seiner Inkompetenz bekannt ist.

Der Singular und Plural ist eines der Probleme die man beim Übersetzen von Texten haben kann.

Ach Unsinn du bist ja nur neidisch *g. Und ich bin nicht nur auf php.de unterwegs. In anderen Foren hab ich Teilweise schon über 2000 Beträge die wesentlich sinnvoller sind als deine nutzlosen Kommentare. Wenn ich den nick ändere würdest du es garnichtmal mitbekommen.

Auch scheint es dir schwer zu fallen ein Datum zu lesen traurig aber wahr.

Und wo wurde behauptet das man Gettext nicht nutzen soll? Ich glaub du interpretierst nur Sachen dazu die du hören willst.

gettext ist ein mächtiges php Tool!
(http://php.net/manual/de/book.gettext.php)


Mfg Splasch
 
Zuletzt bearbeitet:
Werbung:
Zurück
Oben