найкращий спосіб зробити веб-сайт codeigniter багатомовним. виклик з масивів lang залежить від сеансу lang?


81

Я досліджую години і години, але не зміг знайти ясного, ефективного способу зробити це: /

У мене є базовий веб-сайт codeigniter англійською мовою, і я зараз повинен додати польську мову. Який найкращий спосіб зробити свій сайт двома мовами залежно від вибору відвідувача?

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

Цінувати допомагає! У мене закінчується термін: / дякую !!


1
всі відповіді, розміщені тут, чудові, але, використовуючи їх, ви втрачаєте можливість готівки на своїх сторінках, оскільки його один контролер, який буде кешовано, і він буде останньою мовою, яку ви встановили. є рішення для цього іншого, ніж використання іншого контролера для кожної мови.

Відповіді:


93

Ви бачили мовну бібліотеку CodeIgniter ?

Мовний клас забезпечує функції отримання мовних файлів та рядків тексту для цілей інтернаціоналізації.

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

Мовні файли зазвичай зберігаються у вашій системі / мовному каталозі. Ви також можете створити папку з назвою мова всередині папки програми та зберігати їх там. 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-адресі та / або унікального сегмента псевдоніма, який ідентифікує єдиний вміст єдиною мовою. Я досі не придумав, як краще керувати цим. Ось чому я наткнувся на цю тему.
Luis Martin

@Randell це працює, але чи можете ви пояснити детально, як перекласти на іншу мову за допомогою onclick .... я маю на увазі, чи потрібно це зберігати в сеансах? як

@Nadh, найкраще опублікувати своє питання в новій темі, щоб ми могли тримати стислі обговорення.
Randell

22

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

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

Тоді ви можете захопити його в будь-який час так:

$language = $this->session->userdata('language');

так, це було моє чергове питання. Ви мені вже допомогли: D великі дякую! Я також думав скористатися файлом cookie, щоб запам'ятати вибір мови відвідувача.
дизайнер, що намагається кодувати

1
де мені визначити ці сеанси? Я вважаю, що не годиться визначати їх у контролерах для кожної сторінки. повинен бути способом, який я визначаю в глобальному файлі, і він впливає на весь сайт. Дякую!!
дизайнер намагається кодувати

Якось існує кращий спосіб це зробити. Але це абсолютно нове питання. Але це можна зробити лише для того, щоб розпочати.
Ренделл,

7

У контролері додайте наступні рядки під час створення конструктора

тобто після

батьківський :: Controller ();

додати нижче рядків

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

створити допоміжний файл lang_translate_helper.php з наступною функцією і помістити його в каталог систем \ 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 => value_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 ('ласкаво просимо', $ this);

АБО

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

зверніть увагу на пробіл у привіт і слово, ви можете використовувати його і таким чином :)

якщо в мовному файлі немає ярлика, він просто надрукує те, що ви передали мітці функції.


1

Я відповідаю на відповідь Ренделла.

Однак завжди можна інтегрувати GeoIP, такий як http://www.maxmind.com/app/php або http://www.ipinfodb.com/ . Тоді ви можете зберегти результати за допомогою класу сеансу codeigniter.

Якщо ви хочете використовувати API ipinfodb.com, ви можете додати файл ip2locationlite.class.php до папки бібліотеки програм codeigniter, а потім створити функцію моделі, яка виконуватиме будь-яку логіку geoip, необхідну для вашого додатку, наприклад:

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
Виявлення мови на основі ІР працює не дуже добре. Подумайте про VPN, мандрівників, емігрантів чи просто країни з кількома мовами, такі як Канада чи Китай. Краще використовувати мову браузерів.
PiTheNumber

1

Для зручності використання ІТ оновив це, щоб ви могли просто використовувати

$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.


Чому люди відчувають потребу в глобальному використанні? Це легко, але може створити величезні проблеми.
Starlays

0

Керуючи фактичними файлами, речі можуть вийти з синхронізації досить легко, якщо ви не будете насправді пильними. Тож ми запустили безкоштовну (бета-версію) службу під назвою String, яка дозволяє легко відстежувати свої мовні файли та співпрацювати з перекладачами.

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

Рядок абсолютно безкоштовний, тому, будь ласка, перевірте його та повідомте нам, що ви думаєте.

Він фактично також побудований на Codeigniter! Перевірте бета-версію на веб- сайті http://mygengo.com/string


Це насправді хороший момент; З часом мовні файли 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;
}

.... а потім я використовую звичайно внутрішній механізм ІС

о, майже забути! у поданнях я використовую кнопки, які встановлюють "мову" файлів 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];  
}

6
Це приклад поганого програмування, без образ. НЕ визначайте константи у функції. Ось чому його називають постійним, його значення не змінюється, тому воно буде визначене лише один раз. По-друге, коду isset($lang[$language][$word]) == FALSEбуло б достатньо саме такого isset($lang[$language][$word]), оскільки isset повертає лише true і false. І по-третє, коли ви оцінюєте, чи є щось неправдивим, ЗАВЖДИ використовуйте ===для перевірки типу .
машинний вирок

-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якщо ви користувались будь-якою бібліотекою або помічником, спочатку поділіться ним.
Алі Корбані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.