multilanguage codeigniter vanuit db

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
Hoi tweakers,

Ben inmiddels een tijdje aan het rotzooien met multilanguage en codeigniter. Enige verschil is dat zo'n beetje alle oplossingen binnen CI uitgaan van mutli-lang op basis van files. Ik wil dit allemaal uit mijn db trekken. (Kost me precies 1 query meer in dit geval namelijk, en niet eens een grote)

Sidenotes: Ik gebruik hmvc er ook in, dus ik ben op basis van modules bezig.

Ik heb al dat de paginas van engels naar nederlands en terug kunnen. Alleen zit ik nu nog met het feit dat ik zodra ik iets post, er het volgende gebeurt:

In mijn routes.php:
PHP:
1
2
$route['^(\w{2})/(.*)$'] = '$2/$1';
$route['^(\w{2})$'] = $route['default_controller'];

Dit zorgt ervoor dat de get requests makkelijk goed gaan, alleen met de posts trekt dit de language weg.

Dit levert problemen op omdat er, zodra er geen language is gevonden hij simpelweg redirect naar de homepage.

Nu kan dat ook nog naar dezelfde pagina redirecten met de default taal - maar dat is beyond the point. Ik wil graag weten hoe ik kan zorgen dat ik de taal uit de get request doorgevoerd krijg, dat deze in mijn posts ook nog bereikbaar is.

Heb het geprobeerd met sessies en dit zou in theorie moeten werken, maar ik zoek een.... elegantere oplossing.

Zit te denken aan een default taal per gebruiker. Die taal ophalen en vervolgens die instellen. Scheelt weer een nutteloze variabele en het enige nadeel is dan dat ik overal waar formuliertjes zijn, de user klasse moet includen voordat de sessie begint. (Oftewel, gewoon heel vroeg in de applicatie om een shit-ton aan ifjes te voorkomen.

Toughts? :)

Acties:
  • 0 Henk 'm!

  • Camulos
  • Registratie: Januari 2009
  • Laatst online: 06-09 22:59

Camulos

Stampert

Zelf ook meerdere malen nagedacht over multilanguage uit de DB binnen CI, en uiteindelijk komt het op zoiets neer:

1: Je moet ergens een default taal instellen
2: (optioneel) Je kan taal onthouden per gebruiker in de sessie
3: Haal uit de get de taal, als deze geset is.

Het simpelste is om hiervoor een kleine library of helper te schrijven. Een library die je meteen autoload zal voor elk request detecteren wat de gewenste taal is, zonder dat je speciale dingen hoeft te doen. Hieronder even een voorbeeldje:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
// file: application/libaries/lang.php

// Using the standard MY_ prefix
class MY_Lang
{
    private $CI;    // codeIgniter instance
    private $lang;  // the language for this user

    // constructor
    public function __construct()
    {
        $this->CI =& get_instance(); // set CI instance
        $this->init();
    }

    // function set, sets the language to the selected language and stores in session
    public function set($user_lang)
    {
        $this->lang = $user_lang;
        $this->CI->session->set_userdata( array( 'lang' => $user_lang ) );
    }

    // retrieves the prefered language for this session/url
    public function get()
    {
        return $this->lang;
    }
    
    // init collects the standard language, and then overrides this with a user preference or the url (in that order)
    private function init()
    {
        // set your default language
        
        // if you set it in the config.php file just do this (where standard_lang the variable is)
        $this->lang = $this->CI->config->item('standard_lang');

        // if you want to set it from the Database,
        // make sure DB = loaded: $this->CI->load->database();
        // query DB and set $this->lang

        // check if user has preference
        if($this->CI->session->userdata('lang'))
        {
            $this->lang = $this->CI->session->userdata('lang');
        }

        // final check is the override from the URL
        if($this->CI->input->get('lang')){
            $this->lang = $this->CI->input->get('lang');
        }
    }
}

?>


Zorg dat deze library in de autoload meegenomen wordt onder libraries. Meestal load ik ook de database en sessies direct in.
PHP:
1
2
3
4
<?php
// file: application/autoload.php
$autoload['libraries'] = array('database','session', 'lang');
?>


Doordat je ze autoload hoef je enkel nog de volgende dingen aan te roepen:
PHP:
1
2
3
4
5
6
7
<?php
// retrieving the preferred language
$this->lang->get(); // returns the language

// setting a standard language for this user
$this->lang->set('NL'); // or whatever identifier you use
?>


Sidenotes: Zover ik kan oordelen gebruik je het verkeerde framework. Als je een HMVC php framework wilt gebruiken ben je beter af met Kohana of FuelPHP, die zijn specifiek gemaakt voor HMVC. CodeIgniter is gemaakt voor MVC, met de kanttekening dat er maar 1 controller actief kan zijn; wat weer te maken heeft met de standaard mapping/routering.
In 1 van je andere posts ben je al onduidelijk waarom je de router dusdanig hebt aangepast, en wat je nu bedoeld met modules enzo.

Gelukkig maakt het voor bovenstaande implementatie niet uit welk routerschema je gebruikt binnen CI, de juiste taal zal altijd teruggegeven worden :D

[ Voor 1% gewijzigd door Camulos op 10-07-2012 22:48 . Reden: typo ]

Not just an innocent bystander