najlepszy sposób na uczynienie strony internetowej codeigniter wielojęzyczną. wywołanie z tablic lang zależy od sesji lang?

81

Szukam wielu godzin, ale nie mogłem znaleźć żadnego jasnego, skutecznego sposobu, aby to zrobić: /

Posiadam serwis Codeigniter w języku angielskim i muszę teraz dodać język polski. Jaki jest najlepszy sposób, aby moja witryna była w dwóch językach, w zależności od wyboru odwiedzających?

czy istnieje sposób na utworzenie plików tablic dla każdego języka i wywołanie ich w plikach widoku zależy od wyboru Session from lang? Nie chcę używać bazy danych.

Doceń pomaga! Kończy mi się termin: / dzięki !!

projektant próbuje kodować
źródło
1
wszystkie zamieszczone tutaj odpowiedzi są świetne, ale korzystając z nich tracisz możliwość wypłaty na swoich stronach, ponieważ jest to jeden kontroler, który będzie przechowywany w pamięci podręcznej i będzie w ostatnim ustawionym języku. czy istnieje rozwiązanie tego innego niż przy użyciu innego kontrolera dla każdego języka.

Odpowiedzi:

93

Widziałeś bibliotekę językową CodeIgniter ?

Klasa językowa zapewnia funkcje do pobierania plików językowych i wierszy tekstu w celu internacjonalizacji.

W folderze systemowym CodeIgniter znajdziesz jeden o nazwie language zawierający zestawy plików językowych. W razie potrzeby możesz utworzyć własne pliki językowe, aby wyświetlać komunikaty o błędach i inne komunikaty w innych językach.

Pliki językowe są zwykle przechowywane w katalogu systemowym / językowym. Alternatywnie możesz utworzyć folder o nazwie język w folderze aplikacji i tam je przechowywać. CodeIgniter będzie najpierw szukał w katalogu aplikacji / języka. Jeśli katalog nie istnieje lub określony język nie jest tam zlokalizowany, CI będzie szukać zamiast tego w twoim globalnym folderze system / język.

W Twoim przypadku...

  • musisz stworzyć polish_lang.phpi english_lang.phpwewnątrzapplication/language/polish
  • następnie utwórz klucze w tym pliku (np $lang['hello'] = "Witaj";
  • następnie załaduj go do kontrolera, jak $this->lang->load('polish_lang', 'polish');
  • następnie pobierz wiersz, taki jak $this->lang->line('hello');Po prostu zapisz wartość zwracaną przez tę funkcję w zmiennej, aby móc jej użyć w swoim widoku.

Powtórz kroki dla języka angielskiego i wszystkich innych potrzebnych języków.

Randell
źródło
dzięki za szybką odpowiedź, tak, widziałem to. ale tak naprawdę nie jest jasne: / o tym, jak spełnić moje potrzeby, gdzie tworzyć pliki lang, jaki format, jaką strukturę, jak wywołać itp ... Jestem całkiem nowy w Codeigniter. dlatego szukałem jasnego samouczka lub czegoś. : /
projektant-próbuje-kodować
1
hejooo jest super, działa dobrze: D wielkie dzięki za pomoc! jesteś ratownikiem! :) dzięki
projektant-próbuje-kodować
2
Jest to rozwiązanie dla tekstu nieedytowalnego, ale nie obejmuje treści wielojęzycznych przechowywanych i pobieranych z bazy danych. Witryna wielojęzyczna z niestandardowym systemem zarządzania treścią utworzonym przy użyciu CI będzie potrzebować czegoś więcej. Stworzyłem własną, używając segmentu językowego w adresie URL i / lub unikalnego segmentu aliasu, który identyfikuje jedyną treść w jednym języku. Nadal nie wymyśliłem, jak lepiej sobie z tym poradzić. Dlatego wpadłem na ten wątek.
Luis Martin
@Randell to działa, ale czy możesz wyjaśnić szczegółowo, jak tłumaczyć na inny język przez onclick .... mam na myśli, czy jest to przechowywane w sesjach? jak
@Nadh, najlepiej opublikować swoje pytanie w nowym wątku, abyśmy mogli zachować zwięzłość dyskusji.
Randell,
22

Aby dodać język do sesji, zdefiniowałbym pewne stałe dla każdego języka, a następnie upewniłbym się, że biblioteka sesji jest ładowana automatycznie w config / autoload.php lub ładujesz ją, kiedy jej potrzebujesz. Dodaj żądany język użytkowników do sesji:

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

Następnie możesz go pobrać w dowolnym momencie:

$language = $this->session->userdata('language');
Matthew Rapati
źródło
tak to był mój kolejny problem. już mi pomogłeś: D wielkie dzięki! Zastanawiałem się również nad użyciem pliku cookie do zapamiętania wyboru języka odwiedzającego.
projektant próbujący kodować
1
gdzie powinienem zdefiniować te sesje? Myślę, że nie jest dobrze definiować je w kontrolerach dla każdej strony. musi być sposobem, który zdefiniuję w pliku globalnym i ma to wpływ na całą witrynę. dzięki!!
projektant próbujący kodować
W jakiś sposób jest na to lepszy sposób. Ale to zupełnie nowe pytanie. Ale można to również zrobić, aby zacząć.
Randell
7

W kontrolerze dodaj następujące wiersze podczas tworzenia kreatora

czyli po

rodzic :: Kontroler ();

dodaj poniższe linie

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

utwórz plik pomocniczy lang_translate_helper.php z następującą funkcją i umieść go w katalogu system \ application \ helpers

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

dla każdego języka utwórz katalog ze skrótami języka, takimi jak en, nl, fr, itd., w systemie \ application \ languages

utwórz plik językowy w powyższym (odpowiednim) katalogu, który będzie zawierał tablicę $ lang zawierającą pary label => language_value jak podano poniżej

nl_site_lang.php

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

en_site_lang.php

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

możesz przechowywać wiele plików dla tego samego języka w różny sposób, zgodnie z wymaganiami, np. jeśli chcesz osobnego pliku językowego do zarządzania zapleczem (sekcja administratora), możesz go użyć w kontrolerze jako $ this-> lang-> load ('nl_admin', ' nl ');

nl_admin_lang.php

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

i wreszcie, aby wydrukować etykietę w żądanym języku, uzyskaj dostęp do etykiet, jak pokazano poniżej

label ('witaj', $ this);

LUB

label ('cześć słowo', $ this);

zwróć uwagę na spację w hello & word, której możesz użyć w ten sposób :)

jeśli nie ma zdefiniowanej etykiety w pliku językowym, po prostu wydrukuje to, co przekazałeś do etykiety funkcji.

YoGo
źródło
1

Druga odpowiedź Randella.

Jednak zawsze można zintegrować GeoIP, takie jak http://www.maxmind.com/app/php lub http://www.ipinfodb.com/ . Następnie możesz zapisać wyniki z klasą sesji codeigniter.

Jeśli chcesz używać interfejsu API ipinfodb.com Możesz dodać plik ip2locationlite.class.php do folderu biblioteki aplikacji codeigniter, a następnie utworzyć funkcję modelową, aby wykonać dowolną logikę geoip, której potrzebujesz dla swojej aplikacji, na przykład:

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
źródło
3
Wykrywanie języka na podstawie adresu IP nie działa zbyt dobrze. Pomyśl o VPN, podróżnikach, emigrantach lub po prostu krajach z wieloma językami, takimi jak Kanada czy Chiny. Lepiej jest używać języka przeglądarki.
PiTheNumber
1

Aby ułatwić użytkowanie, CI zaktualizowało to, więc możesz po prostu użyć

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

i do tłumaczenia tekstu

lang('language line');

a jeśli chcesz wypaczyć go wewnątrz etykiety, użyj opcjonalnego parametru

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

To wyjdzie

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

Dobre czytanie http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html

Samy Massoud
źródło
1

Użyłem klasy MY_Language Wiredesignz z wielkim sukcesem.

Właśnie opublikowałem go na githubie, bo nigdzie nie mogę znaleźć jego śladu.

https://github.com/meigwilym/CI_Language

Moje jedyne zmiany to zmiana nazwy klasy na CI_Lang, zgodnie z nowymi zmianami v2.

Mei Gwilym
źródło
Dlaczego ludzie odczuwają potrzebę korzystania z usług globalnych? Jest to łatwe, ale może powodować ogromne problemy.
Starlays
0

Podczas zarządzania rzeczywistymi plikami, rzeczy mogą dość łatwo stracić synchronizację, chyba że jesteś naprawdę czujny. Dlatego uruchomiliśmy (beta) bezpłatną usługę o nazwie String, która umożliwia łatwe śledzenie plików językowych i współpracę z tłumaczami.

Możesz zaimportować istniejące pliki językowe (w postaci tablicy PHP, PHP Define, ini, po lub .strings) lub stworzyć własne sekcje od podstaw i dodawać zawartość bezpośrednio przez system.

Sznurek jest całkowicie darmowy, więc sprawdź go i powiedz nam, co myślisz.

W rzeczywistości jest również oparty na Codeigniter! Sprawdź wersję beta pod adresem http://mygengo.com/string

user151516
źródło
To jest właściwie dobra uwaga; Pliki językowe CI nie są łatwe do utrzymania w czasie.
sourcejedi
0

Używam takiego kodu w 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;
}

.... a następnie używam zwykłego wewnętrznego mechanizmu CI

o, prawie zapomnij! w widokach używam przycisków, które ustawiają „język” plików cookie z preferowanym przez użytkownika językiem.

Więc najpierw ten kod próbuje wykryć "preferowany język" ustawiony w agencie użytkownika (przeglądarce). Następnie kod próbuje odczytać „język” pliku cookie. I na koniec - przełącznik ustawia język dla aplikacji CI

Dmitry Khartsy
źródło
-1

możesz stworzyć taką funkcję

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}
thanhquanky
źródło
6
To jest przykład złego programowania, bez obrazy. NIE definiuj stałych w funkcji. Dlatego nazywa się stałą, jej wartość się nie zmienia, więc zostanie zdefiniowana tylko raz. Po drugie, kod isset($lang[$language][$word]) == FALSEwystarczyłby właśnie w ten sposób isset($lang[$language][$word]), ponieważ isset zwraca tylko prawdę i fałsz. Po trzecie, kiedy oceniasz, czy coś jest fałszywe, ZAWSZE używaj ===do weryfikacji typu .
machineaddict
-1

Przyjacielu, nie martw się, jeśli masz zainstalowaną aplikację wbudowaną w codeignitera i chcesz dodać pakiet językowy, wykonaj następujące kroki:

1. Dodaj pliki językowe w folderze application / language / arabic (dodaję arabski lang w sma2 wbudowany w ci)

2. Przejdź do pliku o nazwie setting.phpw aplikacji / modułów / Ustawienia / widoki / setting.php . Tutaj znajdziesz tablicę

<?php /*

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

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

  'spanish' => 'Español'

Teraz zapisz i uruchom aplikację. Działa dobrze.

snakehead
źródło
nie ma żadnego pliku o nazwie, setting.phpjeśli używałeś jakiejkolwiek biblioteki lub pomocnika, najpierw udostępnij go.
Ali Qorbani