лучший способ сделать сайт codeigniter многоязычным. вызов из массивов lang зависит от сеанса lang?

81

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

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

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

Цените помощь! Срок истекает: / спасибо !!

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

Ответы:

93

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

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

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

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

В твоем случае...

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

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

Рэнделл
источник
спасибо за быстрый ответ, да, я это видел. но на самом деле неясно: / о том, как удовлетворить мою потребность, где создавать файлы lang, какой формат, какую структуру, как вызывать и т. д. Я новичок в codeigniter. вот почему я искал понятный учебник или что-то в этом роде. : /
дизайнер-пытается-кодировать
1
heyooo это здорово, работает хорошо: D большое спасибо за помощь! ты спасатель! :) спасибо
дизайнер-пытается-кодировать
2
Это решение для нередактируемого текста, но оно не распространяется на многоязычный контент, который хранится и извлекается из базы данных. Многоязычному сайту с настраиваемой системой управления контентом, созданной с использованием CI, потребуется нечто большее. Я сделал свой собственный, используя языковой сегмент в URL-адресе и / или сегмент уникального псевдонима, который идентифицирует единственный контент на единственном языке. Я до сих пор не понял, как лучше с этим справиться. Вот почему я наткнулся на эту ветку.
Луис Мартин
@Randell, он работает, но вы можете подробно объяснить, как переводить на другой язык с помощью onclick .... я имею в виду, что это для хранения в сеансах? как
@Nadh, лучше всего разместить свой вопрос в новой ветке, чтобы обсуждение оставалось кратким.
Randell
22

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

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

Тогда вы можете взять его в любое время вот так:

$language = $this->session->userdata('language');
Мэтью Рапати
источник
да, это была моя другая проблема. вы уже выручили меня: D большие спасибо! Я также думал использовать cookie, чтобы запоминать выбор языка посетителем.
дизайнер пытается-кодировать
1
где я должен определить эти сеансы? Я думаю, что не следует определять их в контроллерах для каждой страницы. Должен быть способ, который я определяю в глобальном файле, и он влияет на весь сайт. благодаря!!
дизайнер пытается-кодировать
Как-то есть способ сделать это лучше. Но это совершенно новый вопрос. Но это можно сделать и просто для начала.
Рэнделл,
7

В контроллере добавьте следующие строки, когда вы сделаете cunstructor

то есть после

родитель :: Контроллер ();

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

    $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 и т. д., в system \ application \ languages

создать языковой файл в указанном выше (соответствующем) каталоге, который будет содержать массив $ 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_admin_lang.php

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

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

label ('добро пожаловать', $ this);

ИЛИ ЖЕ

label ('привет, слово', $ this);

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

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

YoGo
источник
1

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

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

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

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;
}
Бен Малликин
источник
3
Определение языка на основе IP работает не очень хорошо. Подумайте о VPN, путешественниках, эмигрантах или просто о странах с несколькими языками, таких как Канада или Китай. Лучше использовать язык браузеров.
PiTheNumber
1

Для упрощения использования 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

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

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

https://github.com/meigwilym/CI_Language

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

Мей Гвилим
источник
Почему люди чувствуют необходимость использовать global? Это легко, но может создать огромные проблемы.
Starlays
0

При управлении фактическими файлами все может довольно легко рассинхронизироваться, если вы не проявляете особой бдительности. Итак, мы запустили (бета) бесплатный сервис под названием String которая позволяет вам легко отслеживать свои языковые файлы и сотрудничать с переводчиками.

Вы можете либо импортировать существующие языковые файлы (в форматах PHP array, PHP Define, ini, po или .strings), либо создавать свои собственные разделы с нуля и добавлять контент непосредственно через систему.

String абсолютно бесплатен, поэтому, пожалуйста, проверьте его и расскажите, что вы думаете.

На самом деле он тоже построен на Codeigniter! Ознакомьтесь с бета-версией на http://mygengo.com/string

user151516
источник
На самом деле это хороший момент; Языковые файлы CI нелегко поддерживать с течением времени.
sourcejedi
0

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

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

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

Дмитрий Харцы
источник
-1

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

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}
Thanhquanky
источник
6
Это пример плохого программирования, без обид. НЕ определяйте константы в функции. Вот почему он называется постоянным, его значение не меняется, поэтому оно будет определено только один раз. Во-вторых, кода isset($lang[$language][$word]) == FALSEбыло бы достаточно isset($lang[$language][$word]), потому что isset возвращает только true и false. И в-третьих, когда вы оцениваете, является ли что-то ложным, ВСЕГДА используйте ===для проверки типа .
machineaddict
-1

Друг, не волнуйтесь, если у вас установлено приложение, встроенное в 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'

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

змееголов
источник
нет файла с именем, setting.phpесли вы использовали какую-либо библиотеку или помощник, пожалуйста, сначала поделитесь им.
Али Корбани 01