Der beste Weg, um die Codeigniter-Website mehrsprachig zu gestalten. Das Aufrufen von Lang-Arrays hängt von der Lang-Sitzung ab.

81

Ich recherchiere stundenlang, aber ich konnte keinen klaren und effizienten Weg finden, dies zu erreichen: /

Ich habe eine Codeigniter-Basis-Website in Englisch und muss jetzt eine polnische Sprache hinzufügen. Was ist der beste Weg, um meine Website je nach Besucherauswahl in zwei Sprachen zu erstellen?

Gibt es eine Möglichkeit, Array-Dateien für jede Sprache zu erstellen und sie in Ansichtsdateien aufzurufen, abhängig von der Sitzung aus der Lang-Auswahl? Ich möchte keine Datenbank verwenden.

Schätzen hilft! Ich habe keine Frist mehr: / danke !!

Designer-Trying-Coding
quelle
1
Alle hier veröffentlichten Antworten sind großartig, aber wenn Sie sie verwenden, verlieren Sie die Einlösungsoption Ihrer Seiten, da der eine Controller zwischengespeichert wird und in der zuletzt von Ihnen festgelegten Sprache vorliegt. Es gibt eine Lösung für diesen anderen, wenn Sie einen anderen Controller verwenden für jede Sprache.

Antworten:

93

Haben Sie die Sprachbibliothek von CodeIgniter gesehen ?

Der Sprachkurs bietet Funktionen zum Abrufen von Sprachdateien und Textzeilen zum Zwecke der Internationalisierung.

In Ihrem CodeIgniter-Systemordner finden Sie eine Sprache namens Sprachdateien. Sie können nach Bedarf Ihre eigenen Sprachdateien erstellen, um Fehler und andere Meldungen in anderen Sprachen anzuzeigen.

Sprachdateien werden normalerweise in Ihrem System- / Sprachverzeichnis gespeichert. Alternativ können Sie einen Ordner namens language in Ihrem Anwendungsordner erstellen und dort speichern. CodeIgniter sucht zuerst in Ihrem Anwendungs- / Sprachverzeichnis. Wenn das Verzeichnis nicht vorhanden ist oder sich die angegebene Sprache dort nicht befindet, sucht CI stattdessen in Ihrem globalen System- / Sprachordner.

In deinem Fall...

  • Sie müssen ein polish_lang.phpund english_lang.phpinnen erstellenapplication/language/polish
  • Erstellen Sie dann Ihre Schlüssel in dieser Datei (z $lang['hello'] = "Witaj";
  • dann laden Sie es in Ihren Controller wie $this->lang->load('polish_lang', 'polish');
  • Rufen Sie dann die Zeile wie folgt ab: $this->lang->line('hello');Speichern Sie einfach den Rückgabewert dieser Funktion in einer Variablen, damit Sie sie in Ihrer Ansicht verwenden können.

Wiederholen Sie die Schritte für die englische Sprache und alle anderen Sprachen, die Sie benötigen.

Randell
quelle
danke für die schnelle antwort, ja ich habe das gesehen. aber es ist eigentlich nicht klar: / darüber, wie ich meine Bedürfnisse erfüllen soll, wo ich Lang-Dateien erstellen soll, welches Format, welche Art von Struktur, wie ich aufrufe usw. Ich bin ziemlich neu bei Codeigniter. deshalb suchte ich nach einem klaren Tutorial oder etw. : /
Designer-versuchen-Codierung
1
heyooo es ist toll, funktioniert gut: D vielen Dank für die Hilfe! Lebensretter du bist! :) danke
Designer-versuchen-Codierung
2
Dies ist die Lösung für nicht bearbeitbaren Text, deckt jedoch keine mehrsprachigen Inhalte ab, die in einer Datenbank gespeichert und abgerufen werden. Eine mehrsprachige Site mit einem benutzerdefinierten Content-Management-System, das mit CI erstellt wurde, benötigt mehr als dies. Ich habe mein eigenes mithilfe eines Sprachsegments in der URL und / oder eines eindeutigen Aliasegments erstellt, das einen einzigen Inhalt in einer einzigen Sprache identifiziert. Ich habe immer noch nicht herausgefunden, wie ich das besser handhaben kann. Deshalb bin ich auf diesen Thread gestoßen.
Luis Martin
@ Randell es funktioniert, aber können Sie Details erklären, wie man mit einem Klick in eine andere Sprache übersetzt ... Ich meine, ist es in Sitzungen zu speichern? wie
@Nadh, es ist am besten, deine Frage in einem neuen Thread zu posten, damit wir die Diskussionen kurz halten können.
Randell
22

Um die Sprache zur Sitzung hinzuzufügen, würde ich einige Konstanten für jede Sprache definieren und dann sicherstellen, dass die Sitzungsbibliothek in config / autoload.php automatisch geladen ist, oder Sie laden sie, wann immer Sie sie benötigen. Fügen Sie der Sitzung die gewünschte Sprache des Benutzers hinzu:

$this->session->set_userdata('language', ENGLISH);

Dann können Sie es jederzeit so greifen:

$language = $this->session->userdata('language');
Matthew Rapati
quelle
Ja, das war mein anderes Problem. du hast mir schon geholfen: D große danke! Ich dachte auch daran, Cookies zu verwenden, um mich an die Lang-Auswahl des Besuchers zu erinnern.
Designer-versuchen-Codierung
1
Wo soll ich diese Sitzungen definieren? Ich denke, es ist nicht gut, diese bei Controllern für jede Seite zu definieren. muss ein Weg sein, den ich in einer globalen Datei definiere und der alle Sites betrifft. Vielen Dank!!
Designer-versuchen-Codierung
Irgendwie gibt es einen besseren Weg, dies zu tun. Aber das ist eine völlig neue Frage. Dies kann aber auch getan werden, um Ihnen den Einstieg zu erleichtern.
Randell
7

Fügen Sie im Controller die folgenden Zeilen hinzu, wenn Sie den Cunstructor erstellen

dh nach

parent :: Controller ();

Fügen Sie die folgenden Zeilen hinzu

    $this->load->helper('lang_translate');
    $this->lang->load('nl_site', 'nl'); // ('filename', 'directory')

Erstellen Sie die Hilfsdatei lang_translate_helper.php mit der folgenden Funktion und legen Sie sie im Verzeichnis system \ application \ helpers ab

function label($label, $obj)
{
    $return = $obj->lang->line($label);
    if($return)
        echo $return;
    else
        echo $label;
}

Erstellen Sie für jede Sprache ein Verzeichnis mit Sprachabkürzungen wie en, nl, fr usw. unter system \ application \ language

Erstellen Sie eine Sprachdatei im obigen (jeweiligen) Verzeichnis, die das Array $ lang enthält, das Paare enthält. label => language_value (siehe unten)

nl_site_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

en_site_lang.php

$lang['welcome'] = 'Welcome';
$lang['hello word'] = 'Hello Word';

Sie können mehrere Dateien für dieselbe Sprache mit unterschiedlichen Anforderungen speichern. Wenn Sie beispielsweise eine separate Sprachdatei für die Verwaltung des Backends (Administratorabschnitt) benötigen, können Sie diese im Controller als $ this-> lang-> load ('nl_admin', 'verwenden.) nl ');

nl_admin_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

und schließlich, um das Etikett in der gewünschten Sprache zu drucken, greifen Sie auf die Etiketten wie unten in der Ansicht zu

label ('welcome', $ this);

ODER

label ('Hallo Wort', $ this);

Beachten Sie das Leerzeichen in Hallo & Wort, das Sie auch so verwenden können :)

Wenn in der Sprachdatei kein Etikett definiert ist, wird einfach das gedruckt, was Sie an das Funktionsetikett übergeben haben.

YoGo
quelle
1

Ich stimme Randells Antwort zu.

Man könnte jedoch immer ein GeoIP wie http://www.maxmind.com/app/php oder http://www.ipinfodb.com/ integrieren . Anschließend können Sie die Ergebnisse mit der Codeigniter-Sitzungsklasse speichern.

Wenn Sie die API ipinfodb.com verwenden möchten, können Sie die Datei ip2locationlite.class.php zu Ihrem Codeigniter-Anwendungsbibliotheksordner hinzufügen und dann eine Modellfunktion erstellen, um die für Ihre Anwendung erforderliche Geoip-Logik auszuführen, z.

function geolocate()
{
    $ipinfodb = new ipinfodb;
    $ipinfodb->setKey('API KEY');

    //Get errors and locations
    $locations = $ipinfodb->getGeoLocation($this->input->ip_address());
    $errors = $ipinfodb->getError();

   //Set geolocation cookie
   if(empty($errors))
   {
       foreach ($locations as $field => $val):
            if($field === 'CountryCode')
            {
                $place = $val;
            }
       endforeach;
   }
   return $place;
}
Ben Mullikin
quelle
3
Das Erkennen der Sprache anhand der IP funktioniert nicht sehr gut. Denken Sie an VPNs, Reisende, Auswanderer oder einfach an Länder mit mehreren Sprachen wie Kanada oder China. Es ist besser, die Sprache des Browsers zu verwenden.
PiTheNumber
1

Zur einfacheren Verwendung hat CI dies aktualisiert, sodass Sie es einfach verwenden können

$this->load->helper('language');

und Text zu übersetzen

lang('language line');

Wenn Sie es innerhalb des Etiketts verziehen möchten, verwenden Sie den optionalen Parameter

lang('language line', 'element id');

Dies wird ausgegeben

// becomes <label for="form_item_id">language_key</label>

Zum guten Lesen http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html

Samy Massoud
quelle
1

Ich habe die MY_Language-Klasse von Wiredesignz mit großem Erfolg verwendet.

Ich habe es gerade auf Github veröffentlicht, da ich anscheinend nirgendwo eine Spur davon finde.

https://github.com/meigwilym/CI_Language

Meine einzigen Änderungen bestehen darin, die Klasse gemäß den neuen Änderungen in Version 2 in CI_Lang umzubenennen.

Mei Gwilym
quelle
Warum haben die Menschen das Bedürfnis, global zu nutzen? Es ist einfach, kann aber große Probleme verursachen.
Starlays
0

Bei der Verwaltung der eigentlichen Dateien kann es leicht zu Synchronisierungen kommen, wenn Sie nicht wirklich wachsam sind. Deshalb haben wir einen (Beta) kostenlosen Dienst namens gestartet String , mit dem Sie Ihre Sprachdateien einfach verfolgen und mit Übersetzern zusammenarbeiten können.

Sie können entweder vorhandene Sprachdateien (in den Formaten PHP Array, PHP Define, Ini, Po oder .strings) importieren oder eigene Abschnitte von Grund auf neu erstellen und Inhalte direkt über das System hinzufügen.

Die Zeichenfolge ist völlig kostenlos. Bitte probieren Sie sie aus und teilen Sie uns Ihre Meinung mit.

Es basiert tatsächlich auch auf Codeigniter! Schauen Sie sich die Beta unter http://mygengo.com/string an

user151516
quelle
Das ist eigentlich ein guter Punkt; Die Sprachdateien von CI sind im Laufe der Zeit nicht einfach zu pflegen.
Sourcejedi
0

Ich verwende solchen Code in config.php:

$lang = 'ru'; // this language will be used if there is no any lang information from useragent (for example, from command line, wget, etc...

if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
$tmp_value = $_COOKIE['language'];
if (!empty($tmp_value)) $lang = $tmp_value;
switch ($lang)
{
    case 'ru':
        $config['language'] = 'russian';
        setlocale(LC_ALL,'ru_RU.UTF-8'); 
        break;
        case 'uk':
        $config['language'] = 'ukrainian';
        setlocale(LC_ALL,'uk_UA.UTF-8'); 
                break;
        case 'foo':
        $config['language'] = 'foo';
        setlocale(LC_ALL,'foo_FOO.UTF-8'); 
                break;
        default:
        $config['language'] = 'english';
        setlocale(LC_ALL,'en_US.UTF-8'); 
        break;
}

.... und dann benutze ich normalerweise die interne Mechanik von CI

o, fast vergessen! In Ansichten verwende ich Schaltflächen, die die vom Benutzer bevorzugte Cookie-Sprache mit der Sprache festlegen.

Also, zuerst versucht dieser Code, "bevorzugte Sprache" zu erkennen, die im Useragent (Browser) des Benutzers festgelegt ist. Dann versuchen Sie mit dem Code, die Cookie-Sprache zu lesen. Und schließlich - Schalter legt die Sprache für die CI-Anwendung fest

Dmitry Khartsy
quelle
-1

Sie können eine Funktion wie diese erstellen

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}
thanhquanky
quelle
6
Dies ist ein Beispiel für schlechte Programmierung, keine Beleidigung. Definieren Sie keine Konstanten in einer Funktion. Deshalb heißt es konstant, sein Wert ändert sich nicht und wird nur einmal definiert. Zweitens isset($lang[$language][$word]) == FALSEwürde der Code einfach so ausreichen isset($lang[$language][$word]), da isset nur true und false zurückgibt. Und drittens, wenn Sie bewerten, ob etwas falsch ist, verwenden Sie IMMER ===, um den Typ zu überprüfen .
Machineaddict
-1

Freund, keine Sorge, wenn Sie eine in Codeigniter integrierte Anwendung installiert haben und ein Sprachpaket hinzufügen möchten, gehen Sie einfach wie folgt vor:

1. Fügen Sie Sprachdateien im Ordner application / language / arabic hinzu (ich füge arabisch lang in sma2 in ci hinzu)

2. Gehen Sie auf die Datei mit dem Namen setting.phpin application / modules / Einstellungen / views / setting.php . Hier finden Sie das Array

<?php /*

 $lang = array (
  'english' => 'English',

  'arabic' => 'Arabic',  // i add this here

  'spanish' => 'Español'

Speichern Sie nun die Anwendung und führen Sie sie aus. Es hat gut funktioniert.

Schlangenkopf
quelle
Es gibt keine Datei mit dem Namen, setting.phpwenn Sie eine Bibliothek oder einen Helfer verwendet haben. Bitte teilen Sie diese zuerst mit.
Ali Qorbani