лучший способ сделать сайт на сайте многоязычным. вызов из массивов lang зависит от сеанса lang? - PullRequest
79 голосов
/ 25 августа 2009

Я исследую часы и часы, но я не смог найти какой-либо четкий и эффективный способ сделать это: /

У меня есть базовый веб-сайт codeigniter на английском языке, и я должен добавить польский язык сейчас. Как лучше всего сделать мой сайт на двух языках в зависимости от выбора посетителя?

есть ли способ создать файлы массивов для каждого языка и вызвать их в файлах представлений, зависит от выбора сеанса от lang? Я не хочу использовать базу данных.

Ценю, помогает! У меня заканчивается срок: / спасибо !!

Ответы [ 11 ]

91 голосов
/ 25 августа 2009

Вы видели языковую библиотеку CodeIgniter ?

Языковой класс предоставляет функции извлекать языковые файлы и строки текста в целях интернационализации.

В вашей системной папке CodeIgniter вы найти один названный язык, содержащий наборы языковых файлов. Вы можете создать свой собственные языковые файлы по мере необходимости в порядке отображать ошибки и другие сообщения в другие языки.

Языковые файлы обычно хранятся в Ваш системный / языковой каталог. вперемежку Вы можете создать папку с именем языка внутри вашей папки приложения и магазина их там. CodeIgniter будет выглядеть первым в вашем каталоге приложений / языка. Если каталог не существует или указанный язык там не расположен CI вместо этого будет смотреть в ваш глобальный папка system / language.

В вашем случае ...

  • вам нужно создать polish_lang.php и english_lang.php внутри application/language/polish
  • затем создайте ключи внутри этого файла (например, $lang['hello'] = "Witaj";
  • затем загрузите его в свой контроллер как $this->lang->load('polish_lang', 'polish');
  • затем извлеките строку как $this->lang->line('hello'); Просто сохраните возвращаемое значение этой функции в переменной, чтобы вы могли использовать ее в своем представлении.

Повторите шаги для английского языка и всех других нужных вам языков.

22 голосов
/ 25 августа 2009

Кроме того, чтобы добавить язык к сеансу, я бы определил некоторые константы для каждого языка, а затем удостоверился, что у вас есть библиотека сеансов, автоматически загружаемая в config / autoload.php, или вы загружаете ее, когда вам это нужно.Добавьте желаемый язык пользователя к сеансу:

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

Затем вы можете получить его в любое время, как это:

$language = $this->session->userdata('language');
7 голосов
/ 28 декабря 2010

В контроллере добавьте следующие строки при создании конструктора

т.е. после

Родитель :: Controller ();

добавить строки ниже

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

создайте вспомогательный файл lang_translate_helper.php со следующей функцией и поместите его в каталог system \ application \ helpers

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

для каждого языка создайте каталог с сокращением языка, например en, nl, fr и т. Д., В разделе Система \ Application \ языки

создать языковой файл в указанной (соответствующей) директории, который будет содержать массив $ lang, содержащий пары label => language_value, как указано ниже

nl_site_lang.php

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

en_site_lang.php

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

Вы можете хранить несколько файлов для одного и того же языка по-разному в соответствии с требованием например, если вам нужен отдельный языковой файл для управления бэкендом (раздел администратора), вы можете использовать его в контроллере как $ this-> lang-> load ('nl_admin', 'nl');

nl_admin_lang.php

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

и наконец чтобы распечатать этикетку на желаемом языке, используйте метки, как показано ниже

label ('welcome', $ this);

OR

label ('hello word', $ this);

обратите внимание на пробел в hello & word, вы также можете использовать его следующим образом :)

если в языковом файле не определена метка, он просто напечатает то, что вы передали метке функции.

1 голос
/ 10 сентября 2013

С большим успехом я использовал класс MY_Language от Wiredesignz.

Я только что опубликовал его на github, так как я не могу найти его след нигде.

https://github.com/meigwilym/CI_Language

Мои единственные изменения - переименовать класс в CI_Lang в соответствии с новыми изменениями v2.

1 голос
/ 10 сентября 2013

Для более легкого использования CI обновил это, так что вы можете просто использовать

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

и для перевода текста

lang('language line');

и если вы хотите деформировать его внутри метки, используйте необязательный параметр

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

Это выдаст

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

Для хорошего чтения http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html

1 голос
/ 14 апреля 2011

Я второй ответ Рэнделла.

Однако, всегда можно интегрировать GeoIP, например http://www.maxmind.com/app/php или http://www.ipinfodb.com/. Затем вы можете сохранить результаты с помощью класса сеанса codeigniter.

Если вы хотите использовать API ipinfodb.com. Вы можете добавить файл ip2locationlite.class.php в папку библиотеки приложения codeigniter, а затем создать функцию модели для выполнения любой логики геоипа, необходимой для вашего приложения, например: 1009 *

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;
}
0 голосов
/ 08 января 2017

Я использую такой код в 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;
}

.... а потом я использую обычный внутренний механизм CI

о, почти забудь! во взглядах я использую кнопки, которые устанавливают куки 'language' с языком, предпочитаемым пользователем.

Итак, сначала этот код пытается определить «предпочитаемый язык», установленный в пользовательском пользовательском агенте (браузере). Затем код попробуйте прочитать cookie «язык». И наконец - переключение устанавливает язык для CI-приложения

0 голосов
/ 24 мая 2014

Друг, не волнуйтесь, если у вас установлено какое-либо приложение, встроенное в codeigniter, и вы хотите добавить какой-нибудь языковой пакет, просто выполните следующие действия:

1. Добавить языковые файлы в папку application / language / arabic (я добавляю арабский язык в sma2, встроенный в ci)

2. Перейти к файлу с именем setting.php в application / modules / settings / views / setting.php . Здесь вы найдете массив

<?php /*

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

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

  'spanish' => 'Español'

Теперь сохраните и запустите приложение. Работает нормально.

0 голосов
/ 24 октября 2013

Подписаться https://github.com/EllisLab/CodeIgniter/wiki/CodeIgniter-2.1-internationalization-i18n

это просто и понятно, также посмотрите документ @ http://ellislab.com/codeigniter/user-guide/libraries/language.html

это проще, чем

0 голосов
/ 20 апреля 2010

вы можете сделать такую ​​функцию

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}
...