Интернационализация CodeIgniter 2.1 i18n - переопределение языка по умолчанию, если существуют пользовательские данные - PullRequest
3 голосов
/ 14 февраля 2012

Я использую CI версии 2.1 и недавно установил интернационализацию CodeIgniter 2.1 i18n (оригинальный автор: Jérôme Jaglale).Инструкции по коду приведены здесь: http://codeigniter.com/wiki/URI_Language_Identifier/

Он работает нормально, но я хотел бы переопределить язык по умолчанию, если пользователь установил свои языковые предпочтения при предыдущем посещении веб-сайта (это будет храниться в таблице вбаза данных).

Мой вопрос, как вы это делаете?

Я считаю, MY_Lang.php (где загружен язык по умолчанию) на самом деле загружается ДО CodeIgniter MY_Controller, поэтому яневозможно загрузить базу данных, чтобы определить, есть ли у пользователя предпочтительный язык.

Язык по умолчанию настроен в MY_Lang.php здесь:

function default_lang()
{
    $browser_lang = !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? strtok(strip_tags($_SERVER['HTTP_ACCEPT_LANGUAGE']), ',') : '';
    $browser_lang = substr($browser_lang, 0,2);
    $default_lang = array_splice(array_keys($this->languages), 0,1); 
    return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang : $default_lang[0]; 
}

Однако я не могу переопределить его, потому чтоздесь у меня нет доступа к моему $this->session->userdata('language')

Заранее спасибо!


ОТВЕТ ЗДЕСЬ:


Узнал, чтоВы можете использовать собственные PHP-куки для чтения куки в файле MY_Lang.php.Если вы попытаетесь использовать cookie-помощник, он не будет работать, поэтому убедитесь, что вы используете вместо этого $ _COOKIE и запускаете соответствующие фильтры, прежде чем получать содержимое.

Затем в MY_Lang.php просто измените это:

return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang : $default_lang[0]; 

На это:

if($_COOKIE['int_lang']) {
$preferred_lang = filter_var($_COOKIE['int_lang'], FILTER_SANITIZE_STRING);
return (array_key_exists($preferred_lang, $this->languages)) ? $preferred_lang : $default_lang[0];
}
else
{
return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang : $default_lang[0]; 
}

1 Ответ

2 голосов
/ 15 февраля 2012

Если бы это был я, я бы использовал куки для этого вместо того, чтобы хранить это в базе данных. Это будет быстрее и проще в управлении.

Большинство пользователей не стирают куки, по крайней мере, не так часто. Это решило бы вашу проблему: «Я не могу загрузить базу данных, чтобы определить, есть ли у пользователя предпочтительный язык».

Если вам нужно хранилище базы данных, вы можете попробовать использовать Hook: http://codeigniter.com/user_guide/general/hooks.html

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...