2009-03-24 2 views
0

Ich schreibe diese Frage auf eigene, wie ich Post eins fand, die vollständige Erklärung oder den besten Weg, es zu tun hat.Wie implementiert man mehrere Sprachen in PHP-Anwendungen?

Sollte ich eine Sprachdatei wie Elemente zu nennen:

$ first_name = 'Name'; $ last_name = 'last_name';

und dann diese Datei je nach Auswahl enthalten?

Ich habe eine App, die ich in zwei Sprachen haben muss.

Wird etwas in diesen Zeilen mögen:

http://www.myapp.com/?lang=en http://www.myapp.com/?lang=es

Soll ich eine Konstanten für diesen Zweck einreichen?

constants.php

define ('OPERATION_NOT_ALLOWED_EN', 'Diese Operation ist nicht erlaubt!');

definieren ('OPERATION_NOT_ALLOWED_ES', 'Diese Operation ist nicht erlaubt!');

Was ist der empfohlene Weg, dies zu erreichen?

Antwort

3

Sie - sie $lang[] Array mit Code verwenden, der wie folgt aussieht:

$lang['Next'] = 'Next'; 
$lang['Previous'] = 'Previous'; 
$lang['Goto_page'] = 'Goto page'; 
$lang['Joined'] = 'Joined'; 
$lang['IP_Address'] = 'IP Address'; 

$lang['Select_forum'] = 'Select a forum'; 
$lang['View_latest_post'] = 'View latest post'; 
$lang['View_newest_post'] = 'View newest post'; 
$lang['Page_of'] = 'Page <b>%d</b> of <b>%d</b>'; // Replaces with: Page 1 of 2 for example 

$lang['ICQ'] = 'ICQ Number'; 
$lang['AIM'] = 'AIM Address'; 
$lang['MSNM'] = 'MSN Messenger'; 
$lang['YIM'] = 'Yahoo Messenger'; 

Es ist natürlich von einer Datei in den Einstellungen des Benutzers festgelegten Format angegeben, aber Sie würden in Ordnung mit Ihrem Vorschlag von ?lang=en in der Abfragezeichenfolge Zugriff auf etwas ähnlich wie ein constants.php Datei.

Sie könnten die Datei lang_en.php oder etwas ähnliches zur besseren Übersicht benennen.

+0

Ich empfehle diese Methode auch. – jerebear

0

würde ich locale-spezifischen Dateien mit Konstanten verwenden, zB:

locale_en.php: 

define('GREETING', "Welcome to Widgets Inc'); 

und

locale_de.php: 

define('GREETING', 'Wir begruessen Sie zu Widgets Inc'); 

in Ihrem Setup erkennen Sie das Gebietsschema und zu tun:

if ($locale == 'en') { 
    require 'locale_en.php'; 
} else if ($locale == 'de') { 
    require 'locale_de.php'; 
} 

Dies gibt Sie profitieren von Konstanten und machen die Lokalisierung relativ transparent für Ihre Anwendung, da Sienicht tun müssenüberall. Wenn irgendetwas länderspezifisch ist, lege es einfach in die Gebietsschema-Dateien.

Wenn Sie eine Gebietsschema-Datei hinzufügen möchten, kopieren Sie einfach ein vorhandenes und ändern Sie alle Referenzen, anstatt Ihre Codebase für sie zu durchsuchen.

Sie können auch Code in diese Dateien einfügen, wie das Formatieren von Zahlen und Datumsangaben für diese Ländereinstellungen (einschließlich der richtigen Namen in jeder Sprache, aber auch die Verwendung von Kommas, Anführungszeichen, Punkten usw.), Währungsumrechnungen und Anzeigen usw . auf den Spuren von phpBB folgen

+0

Erkenne ich die Sprache mit GET? Etwas wie: $ locale = $ _GET ['lang']; DAS wird von der URI lesen? – Codex73

+0

Es gibt Probleme mit der Sprache zur automatischen Erkennung. Ich würde einfach auf Englisch (oder was auch immer für die Hauptwebsite Publikum geeignet ist) und dann kleine Flaggen auf der Seite haben, um es zu ändern, die es in den Cookie setzen wird. – cletus

1

Das funktioniert für Strings wie Sie in Ihrem Beispiel angegeben haben.Aber es gibt andere Komplikationen. Möchten Sie beispielsweise Datumsangaben im entsprechenden Format für das Gebietsschema (es vs en?) Formatieren? Wie steht es mit der Formatierung von Zahlen und Währungen? Möglicherweise haben Sie auch "dynamische" Nachrichten: "Sie haben $ x Nachrichten in Ihrem Posteingang". Wo möchten Sie Variablen übergeben? Überprüfen Sie einige der php Lokalisierungsbibliotheken. Hier ist ein Online-Tutorial: http://www.devx.com/webdev/Article/38732.

Schauen Sie sich auch das Framework an, das Sie verwenden. Viele von ihnen haben Lokalisierungsunterstützung.

0

Es gibt freie Steuerelemente von Drittanbietern, die dies tun, indem sie eine ISO-Standard-XML-Datei verwenden (Ich habe ein Datenbank-Dienstprogramm geschrieben, um & Export in dieses Format zu erstellen).

Die anderen Antworten sind sehr manuell und erfordern mehr Arbeit als die Verwendung dieser Kontrolle.

Die Kontrolle, die Sie brauchen, um zu finden ist: http://ezcomponents.org/docs/api/trunk/introduction_Translation.html

Nachdem der eZ Components werden auf dem Server installiert, müssen Sie die Basissteuerung für alle eZ Components

require_once "ezc/Base/base.php"; 
/** 
* __autoload() 
* 
* @param mixed $className 
* @return 
*/ 
function __autoload($className) 
{ 
    ezcBase::autoload($className); 
} 

Dann müssen Sie erforderlich abrufen definieren, wo die XML-Sprachdatei befindet (siehe: ISO639-2, ISO3166, und Qt Linguist)

$config["language_code"] = "en_us"; // as defined by ISO639-2 and ISO3166 

// grab our translation XML file 
$backend = new ezcTranslationTsBackend(dirname(__FILE__). '/translations'); 
$backend -> setOptions(array('format' => $config["language_code"].'.xml')); 

// create a manager object 
$manager = new ezcTranslationManager($backend); 

$language = $manager->getContext($config["language_code"], 'strings'); 

n ow Sie können Strings greifen einfach durch Aufruf der folgenden Funktion

getTranslation("SOME_KEY"); 

und Phrasen abrufen, die Parameter, die die folgende Syntax verwenden, beachten Sie bitte die Beziehung zwischen [STICHWORT] und „Schlüsselwort“ ist beabsichtigt und empfohlen

getTranslation("FIND_[KEYWORD]_BY_[TYPE]", array("keyword" => $keyword, "type" => $type)); 

ein Beispiel für eine TS XML-Datei wird

<!DOCTYPE TS> 
<TS> 
<context> 
    <name>strings</name> 
    <message> 
     <source>ZONE_TYPE</source> 
     <translation>Zone Type</translation> 
    </message> 
    <message> 
     <source>ZONE_TOOL</source> 
     <translation>Zone Tool</translation> 
    </message> 
    <message> 
     <source>HELLO_[NAME]_WELCOME_TO</source> 
     <translation>Hello, %name, welcome to Webfood Admin</translation> 
    </message> 
    <message> 
     <source>YOUR_ADMINISTRATIVE_SESSION_HAS</source> 
     <translation>Your administrative session has timed out. Please login again.</translation> 
    </message> 
</context> 
</TS> 

ich würde einfach eine Einstellung in Ihren PHP-Sitzungen, dass der LAN hat (sollte en_US.xml genannt werden), speichert verwendet werden, fragen Sie den Benutzer vor oder nach der Anmeldung in der gewünschten Sprache und speichern Sie ihn in der Benutzertabelle, wenn Sie über Konten verfügen. Es gibt keinen Grund, weiterhin einen URL-Wert zu senden, das ist eine schlechte Idee.

+0

Ty, freue mich auf den Link. – Codex73