Frage

Fragen aktualisiert, anstatt eine neue Frage zu machen ...

Ich mag wirklich ein paar alternativen Sprachen anderes dann Englisch auf meinem sozialen Netzwerk vor Ort zu schaffen, ich bin Gebäude, das ist mein erstes Mal sein wird, jede Art der sprachlichen Übersetzung tut so tragen Sie bitte mit mir.
Ich erforsche, so bin ich al Ohr und offen für Ideen und ich habe viel ist bereits hier sind die Fragen.

1)
Was bedeutet i18n, ich sehe es oft, wenn auf SO Sprachübersetzung forschen?

2)
Die meisten Leute sagen benutzen gettext PHP hat eine Verlängerung oder Unterstützung für sie,
Nun, ich habe es erforscht, und ich habe ein grundlegendes Verständnis davon, soweit ich es sagen kann, ist eine Menge zusätzlicher Arbeit diesen Weg zu gehen,
Ich meine Codierung meiner Seite zu verwenden, es ist Funktionen, dh; _ ( 'Hallo Welt ich in Englisch bin jetzt') oder auch gettext ( 'Hallo Welt ich in Englisch bin jetzt') ist kein Problem, da jede Strecke ich gehe wird dazu nötig.
Aber dann müssen Sie auf Ihrem Server installieren gettext und bekommen es funktioniert,
verwenden Sie dann einige spezielle Editoren spezielle Dateien zu erstellen und kompilieren sie ich denke?

Klingt wie ein Schmerz, ich verstehe das soll der beste Weg sein, obwohl zu gehen, gut jeder scheint zu sagen, es ist.
Also kann mir jemand sagen, warum dies der Weg zu gehen?

3)
Ich mag die Einfachheit dieses Ansatzes wirklich, nur eine Sprache Array Aufbau und den Aufruf die Phrase, die Sie unten wie das Beispiel in einer Funktion benötigen  Sie würden dann einfach ein File mit der entsprechenden Sprache Array.

Was ich wirklich wissen will, ist, würde dies die weniger ein bessere Performance-Methode auf einem hohen Verkehr sein und ziemlich große Website im Vergleich zu gettext verwendet und wenn ja, können Sie erklären, warum Sie?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>

* einige Code aus brianreavis Antwort verwendet unter

War es hilfreich?

Lösung

Setzen Sie das Rad nicht neu erfinden. Verwenden Sie zum Beispiel gettext oder Zend_Translate .

Andere Tipps

Es wäre wahrscheinlich am besten sein, eine Funktion zu definieren, die Ihre Sprache Mapping behandelt. Auf diese Weise, wenn Sie Sie ändern möchten, wie es funktioniert später, sind Sie nicht Hunderte von Skripten gezwungen, für Fälle scheuern, wo Sie $lang[...] verwendet und ersetzen sie durch etwas anderes.

So etwas wie dies funktionieren würde, und wäre schön & schnell:

function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}

Machen sicher das Array deklariert static innerhalb der Funktion, so dass es nicht jedes Mal die Funktion aufgerufen wird neu zugewiesen bekommt. Dies ist besonders wichtig, wenn $lang wirklich groß ist.

Um es zu verwenden:

echo lang('NO_PHOTO');

Für mehrere Sprachen Handhabung, haben nur diese Funktion in mehreren Dateien definiert (wie en.php, fr.php, usw.) und die passenden für den Benutzer require().

Dies könnte besser funktionieren:

function _L($phrase){
static $_L = array(
    'NO_PHOTO' => 'No photo\'s available',
    'NEW_MEMBER' => 'This user is new'
);

     return (!array_key_exists($phrase,$_L)) ? $phrase : $_L[$phrase];
}

Das ist, was ich jetzt verwenden. Wenn die Sprache nicht gefunden wird, wird es die Phrase ausgeben, anstatt einen Fehler.

Sie sollten beachten, dass ein Array nicht mehr als ~ 65500 Elemente enthalten kann. Sollte genug sein, aber gut, nur zu sagen.

Hier ist ein Code, den ich für die Sprache des Benutzers überprüfen verwenden:

<?php
function setSessionLanguageToDefault() {
    $ip=$_SERVER['REMOTE_ADDR'];
    $url='http://api.hostip.info/get_html.php?ip='.$ip;
    $data=file_get_contents($url);
    $s=explode (':',$data);
    $s2=explode('(',$s[1]);

    $country=str_replace(')','',substr($s2[1], 0, 3));

    if ($country=='us') {
        $country='en';
    }

    $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country ));
    $_SESSION["_LANGUAGE"]=$country;
}

if (!isset($_SESSION["_LANGUAGE"])) {
    setSessionLanguageToDefault();
}

if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) {
    include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php');
} else {
    include(APP_DIR.'/language/'.DEFAULT_LANG.'.php');
}

?>

Es ist noch nicht fertig, aber auch ich denke, das ist eine große Hilfe sein könnte.

Sie Ihre eigene Sprache Rahmen nicht schreiben. Verwenden Sie gettext . PHP hat Standard Bindungen , die Sie installieren können.

Wie die anderen Antworten wirklich nicht alle Fragen beantworten, die ich für das in meiner Antwort gehen und eine sinnvolle Alternative.

1) I18n ist die Abkürzung für Internationalisierung und hat einige Ähnlichkeiten mit I-achtzehn-n.

2) In meiner ehrlichen Meinung gettext ist eine Verschwendung von Zeit.

3) Ihr Ansatz sieht gut aus. Was Sie für die Sprachvariablen aussehen sollte. Die WoltLab Community Framework 2.0 implementiert ein Zwei-Wege-Sprachsystem. Für einmal gibt es Sprachvariablen, die man nur in der Datenbank und in einer Vorlage gespeichert werden, um den Namen der Variablen verwendet, die dann mit dem Inhalt der Variablen in der aktuellen Sprache (falls vorhanden) ersetzt werden. Der zweite Teil des Systems bietet eine Möglichkeit, nutzergenerierte Inhalte in mehreren Sprachen (Eingabe in mehreren Sprachen erforderlich).

speichern

Im Grunde haben Sie den Schnittstelle Text, der vom Entwickler definiert ist und den Inhalt, die vom Benutzer definiert wird. Der mehrsprachige Text des Inhalts wird in Sprachvariablen und der Name der Sprachvariablen gespeichert wird dann als Wert für das Textfeld in der spezifischen Inhaltstabelle (als einsprachige Inhalte sind auch möglich) verwendet wird.

Die Struktur des WCF ist leider in einer Weise, dass außerhalb des Rahmens Wiederverwendung von Code sehr schwierig ist, aber man kann es als Inspiration verwenden. Der Umfang des Systems hängt einzig und allein auf das, was Sie mit Ihrer Website erreichen wollen. Wenn es wird groß sein, als Sie auf jeden Fall einen Blick auf dem WCF-System nehmen. Wenn es ein paar kleine dedizierte Sprachdateien (en.php, de.php, usw.), aus denen die richtige für die aktuelle Sprache enthalten ist, tun wird.

Leider gettext nicht gut arbeiten und haben Probleme in verschiedener Situation wie auf verschiedenes Betriebssystem (Windows oder Linux) und macht es Arbeit ist sehr schwierig.

Darüber hinaus es erforderlich, dass Sie viel von Umgebungsvariablen und Domänen und diese haben keinen Sinn.

Wenn ein Entwickler wollen einfach die Übersetzung eines Textes erhalten, die er nur die .mo Dateipfad setzen soll und die Übersetzung mit einer Funktion erhalten wie übersetzen ( „Hallo“, „de_DE“); Mit gettext ist dies nicht möglich.

warum nicht Sie machen es nur als mehrdimensionales Array ... wie diese

<?php

$lang = array(
    'EN'=> array(
        'NO_PHOTO'=>'No photo\'s avaiable',
        'NEW_MEMBER'=>'This user is new',
    ),
    'MY'=> array(
        'NO_PHOTO'=>'Tiada gambar',
        'NEW_MEMBER'=>'Ini adalah pengguna baru',
    )
);

?>

Sie können dies tun:

class T {
const language = "English";
const home = "Home";
const blog = "Blog";
const forum = "Forum";
const contact = "Support";
}

würden Sie haben eine Datei wie folgt für jede Sprache. So verwenden Sie den Text:

There is no place like <?=T::home?>.

Der Nachteil ist, dass, wenn Sie eine neue Konstante hinzufügen, haben Sie es zu tun für jede Sprachdatei . Wenn Sie ein, Ihre Seitenumbrüche für diese Sprache vergessen. Das ist ein bisschen eklig, aber es ist effizient, da es kein großes assoziatives Array und möglicherweise die Werte sogar inlined bekommen erstellen muss.

Vielleicht Zugang verbessert werden könnte, zum Beispiel:

class T {
    const home = "home";

    public static function _ ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }

    // Or maybe through an instance:
    public function __get ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }
}
echo "There is no " . T::_("place") . " like " . T::_("home");
$T = new T();
echo "There is no " . $T->place . " like " . $T->home;

Wir vermeiden immer noch die Array und stützen sich auf konstant den Nachschlag zu tun , was ich nehme an ist teurer als die Konstanten direkt verwenden. Die bis Seite ist die Lookup einen Rückfall verwenden kann, wenn der Schlüssel nicht gefunden wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top