Skip to content

i18n Multi language Library Helper

World Wide Web Server edited this page Jul 4, 2012 · 59 revisions

[size=4][b]Not finished yet !!![/b][/size]

[b]Multi-domain:[/b] http://domain.nl (dutch = nl) http://domain.com (english = en)

[b]Multi-language:[/b] http://domain.nl/en (default dutch = nl, override english = en) http://domain.com/nl (default english = en, override dutch = nl)

[b]Multi-segments:[/b] http://domain.nl/en/news (default dutch = nl, override english = en, english segments) http://domain.com/nl/nieuws (default english = en, override dutch = nl, dutch segments)

In this tutorial I use libraries, helpers, routes, configs, hooks, etc.

HMVC proof to use modules...

[b]Used ideas:[/b]

[url=http://maestric.com/doc/php/codeigniter_i18n]Internationalization (i18n) library by Jérôme Jaglale[/url] [url=http://codeigniter.com/wiki/URI_Language_Identifier/]URI Language Identifier by Wiredesignz[/url]

This library / helper uses the usual way CI stores language-files. Inside the [b]application[/b] folder a folder named [b]languages[/b]. Inside laguages the language folders (dutch english etc.) and inside the language folders the language-files. application/languages/dutch/urls_lang.php

[b]application/config/routes.php[/b]

[code]

$route['^(\w{2})/(.*)$'] = '$2'; $route['^(\w{2})$'] = $route['default_controller'];

// Urls start

$route['^mobiel|^handy|^movil|^cell(/:any)?'] = "mobile$1";

// Urls end

[/code]

The part "Urls" is only for the controllers. In my case I have a database with three tables:

Table "url_languages" > columns: lang_id, lang_ci, lang_cc Table "url_segments" > columns: urlseg_id, urlsec_first (bool), urlsec_line, urlsec_text Table "url_languages" > columns: urllang_id, urlseg_id, lang_id, urllang_text

And I will generate the routes and language-files automaticaly. Later more on this...

[b]application/config/config.php[/b]

[code]

// default language

$config['language'] = 'dutch';

// available languages (key: language code, value: language name)

$config['languages'] = array('nl' => 'dutch', 'en' => 'english');

// available countries (key: country code, value: language code)

$config['country_codes'] = array('nl' => 'nl', 'uk' => 'en', 'us' => 'en', 'au' => 'en');

[/code]

[b]application/languages/dutch/urls_lang.php[/b]

[code]

$lang['url_forum'] = "prikbord"; $lang['url_general'] = "algemeen";

[/code]

[b]application/languages/english/urls_lang.php[/b]

[code]

$lang['url_forum'] = "forum"; $lang['url_general'] = "general";

[/code]

When you begin coding the line "url_forum" without url_ is the same as text "forum". But later in your project when the line is used everywhere you can still change the text by simply change it in the language-file.

[b]application/helper/i18n_helper.php[/b]

[code]

function i18n ($item, $param = null) { $CI =& get_instance();

$line = $CI->lang->line($item);

if ($line == null)
{
    log_message('error', 'i18n: unknown item [' . $item . '] in ' . $_SERVER['REQUEST_URI']);
    
    $line = "{" . $item . "}";
}

if ($param == null)
{
    return $line;
}
else
{
    if (is_array($param)) return vsprintf($line, $param); else return sprintf($line, $param);
}

}

function i18n_url ($item, $param = null) { $CI =& get_instance();

if (is_array($item))
{
    $items = $item;
    
    $segments = array();
    
    foreach ($items as $item)
    {
        $line = $CI->lang->line('url_' . $item);
        
        $segments[] = ($line == null) ? $item : $line;
    }
    
    $line = implode('/', $segments);
}
else if (stripos($item, '/'))
{
    $items = explode('/', $item);
    
    foreach ($items as $item)
    {
        $line = $CI->lang->line('url_' . $item);
        
        $segments[] = ($line == null) ? $item : $line;
    }
    
    $line = implode('/', $segments);
}
else
{
    $line = $CI->lang->line('url_' . $item);
    
    if ($line == null)
    {
        $line = $item;
    }
}

$line = site_url($line);

if ($param == null)
{
    return $line;
}
else
{
    if (is_array($param)) return vsprintf($line, $param); else return sprintf($line, $param);
}

}

[/code]

i18n() is a replacement for lang() and does almost the same. Parameter is added to do the folowing:

[code]

// in language file

$lang['time_met_you'] = "This is the % time I met you";

// in view file

echo i18n('time_met_you', '3rd'); // produces: This is the 3rd time I met you

[/code]

i18n() is used for text (not urls) but you can if you would like to use it for urls also. If the line is not found it produces {line} to identify the text is missing. (In the future I would like to rebuild this to show always the default language if line is not found instead of the {line} text.

  1. i18n_url('forum')
  2. i18n_url('forum/general')
  3. i18n_url(array('forum','general'))

In dutch produces same as:

  1. site_url('prikbord')
  2. site_url('prikbord/algemeen')
  3. site_url('prikbord/algemeen')

In english produces same as:

  1. site_url('forum')
  2. site_url('forum/general')
  3. site_url('forum/general')

If a "segment" does not exist, the name used to call the segment is used.

Clone this wiki locally