<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FinalFrag.be &#187; meertaligheid</title>
	<atom:link href="http://finalfrag.be/blog/tag/meertaligheid/feed/" rel="self" type="application/rss+xml" />
	<link>http://finalfrag.be/blog</link>
	<description>De persoonlijke website van Massimo 'FinalFrag' Mertens</description>
	<lastBuildDate>Tue, 04 Aug 2009 07:08:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Arrays in language files (deel&#160;2)</title>
		<link>http://finalfrag.be/blog/2009/05/arrays-in-language-files-deel-2/</link>
		<comments>http://finalfrag.be/blog/2009/05/arrays-in-language-files-deel-2/#comments</comments>
		<pubDate>Sat, 09 May 2009 12:49:10 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[meertaligheid]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=305</guid>
		<description><![CDATA[Deze post is een vervolg op de post &#8216;Arrays in language files&#8216; die ik enkele dagen geleden publiceerde. Op het einde gaf ik enkele suggesties voor uitbreidingen op de code in die post.
Als fervente PHPer kon ik me natuurlijk niet inhouden om die uitbreidingen zelf ook eens te maken, al was het maar om de [...]]]></description>
			<content:encoded><![CDATA[<p>Deze post is een vervolg op de post &#8216;<a href="http://finalfrag.be/blog/2009/05/arrays-in-language-files/"  title="Arrays in language files">Arrays in language files</a>&#8216; die ik enkele dagen geleden publiceerde. Op het einde gaf ik enkele suggesties voor uitbreidingen op de code in die post.</p>
<p>Als fervente PHPer kon ik me natuurlijk niet inhouden om die uitbreidingen zelf ook eens te maken, al was het maar om de uitdaging aan te gaan. Bovendien heb ik van elke mensen al vragen gehad over hoe ze eraan moeten beginnen. Daarom heb ik besloten om dit vervolg te schrijven en een woordje uitleg te geven bij deze uitbreidingen.<span id="more-305"></span></p>
<h3>Meerdimensionale arrays</h3>
<p>De uitbreiding die ik heb geschreven ziet er als volgt uit:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> line <span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vals</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$return</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Er zijn geen waardes opgegeven</span>
        <span style="color: #666666; font-style: italic;">// We gebruiken dan een echo</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'return $this-&gt;language'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Er zijn wel waardes opgegeven</span>
        <span style="color: #666666; font-style: italic;">// We gebruiken dan een sprintf</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'return sprintf($this-&gt;language'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// De volledige key samenstellen aan de hand van de array</span>
    <span style="color: #666666; font-style: italic;">// Dit wordt iets als ['error']['username']['minLength']</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Als $keys een array is halen we alle delen op</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'[\''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\']'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Anders is er maar één key meegegeven aan de functie</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'[\''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$keys</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\']'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Daarna doen we ongeveer hetzelfde voor de waardes</span>
    <span style="color: #666666; font-style: italic;">// Als die er zijn, maken we gebruik van een sprintf (zie bovenaan)</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Als er een array werd meegegeven, doorlopen we deze</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">', \''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$val</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\''</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Anders is er maar één waarde</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">', \''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$vals</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\''</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Op het einde nog even de functie (echo of sprint) juist afsluiten</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">';'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">');'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// En het geheel teruggeven</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$return</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Deze functie staat uiteraard in het MY_Language.php bestand. Aangezien de naam van de functie die hierboven staat &#8216;line&#8217; is, zal de functie van CI_Language overschreven worden. Dit is echter geen probleem, omdat onze eigen functie dezelfde en meer functionaliteiten biedt dan de originele. Om dit even te demonstreren, maak ik gebruik van dutch_lang.php in de map language/dutch/:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'een'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is een voorbeeld'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'twee'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is voorbeeld %s'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'drie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is voorbeeld a'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'drie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is voorbeeld b met als gegevens: %s en %s'</span><span style="color: #339933;">;</span></pre></div></div>

<p>De code om dit te testen is redelijk makkelijk te schrijven. Dit zijn enkele van de tests, maar er zijn er natuurlijk nog meer mogelijk. Zo is er bijvoorbeeld geen test voorzien voor een array van keys met één waarde.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Home <span style="color: #000000; font-weight: bold;">extends</span> Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'een'</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'twee'</span><span style="color: #339933;">,</span>
            <span style="color: #cc66cc;">2</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'drie'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'drie'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bovenstaande code geeft als resultaat:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">Dit is een voorbeeld
Dit is voorbeeld 2
Dit is voorbeeld a
Dit is voorbeeld b met als gegevens: 1 en 2</pre></div></div>

<p>Dat werkt allemaal heel mooi, maar er is nog een tweede uitdaging.</p>
<h3>Alle language file rechtstreeks in de language/ map</h3>
<p>Nu staat alle taalbestanden nog in mappen. Zo staat dutch_lang.php in language/dutch/ en english_lang.php in language/english/. Dit heeft als gevolg dat we steeds deze map moeten meegeven met de $this->lang->load functie.</p>
<p>De enige manier om dit op te lossen is om de load functie van CI_Language te overschrijven. Dit kan door de load functie te kopiëren vanuit Language.php (te vinden in system/libraries/) en te plakken in MY_Language.php. Het enige dat je nu nog moet doen is een stuk code in commentaar zetten, of volledig te verwijderen als je dat liever doet. Het gaat om de if structuur die begint op regel 8 van de functie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$idiom</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$CI</span> <span style="color: #339933;">=&amp;</span> get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$deft_lang</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'language'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$idiom</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$deft_lang</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'english'</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$deft_lang</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wanneer je bovenstaande code in commentaar zet kan je in je controllers</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>vervangen door</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Je moet natuurlijk ook dutch_lang.php verplaatsen van language/dutch/ naar language/.</p>
<h3>En klaar is kees</h3>
<p>Voila, beide ideeën die ik en de vorige post voorstelde zijn bij deze gemaakt. Als er nog vrage zijn, je weet ondertussen wel waar je ze kan zetten&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/05/arrays-in-language-files-deel-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arrays in language&#160;files</title>
		<link>http://finalfrag.be/blog/2009/05/arrays-in-language-files/</link>
		<comments>http://finalfrag.be/blog/2009/05/arrays-in-language-files/#comments</comments>
		<pubDate>Wed, 06 May 2009 16:44:25 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[meertaligheid]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=199</guid>
		<description><![CDATA[Eén van de weinige tekortkomingen in het CodeIgniter framework zijn de language files. Deze bestanden bevatten arrays die vertalingen aanbieden voor een bepaalde tekst. Standaard biedt CodeIgniter slechts de mogelijkheid aan om 1-dimensionale arrays te gebruiken, en dit leid al snel tot beperkingen. In deze blogpost zal ik toelichten hoe je de language klasse van [...]]]></description>
			<content:encoded><![CDATA[<p>Eén van de weinige tekortkomingen in het <a target="_blank" href="http://www.codeigniter.com"  title="CodeIgniter framework">CodeIgniter framework</a> zijn de language files. Deze bestanden bevatten arrays die vertalingen aanbieden voor een bepaalde tekst. Standaard biedt CodeIgniter slechts de mogelijkheid aan om 1-dimensionale arrays te gebruiken, en dit leid al snel tot beperkingen. In deze blogpost zal ik toelichten hoe je de language klasse van CodeIgniter kan uitbreiden zodat deze ook meerdimensionale arrays ondersteunt. Op die manier moet je slechts één bestand per taal aanmaken.<span id="more-199"></span></p>
<h3>De situatie nu</h3>
<p>Wanneer je CodeIgniter download van de website en upload naar je eigen webspace, ben je gebonden aan de 1-dimensionale arrays in language files. Concreet houdt dit in dat je je vertalingen niet kan bundelen. Een kleine language file ziet er bijvoorbeeld zo uit:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is niet lang genoeg.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMaxLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is te lang.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameInvalid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam bevat ongeldige tekens.'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Voor simpele applicaties is dit goed genoeg, maar wanneer je veel teksten hebt die moeten vertaald worden is dit onbegonnen werk. Denk maar eens aan het feit dat je teksten in categorieën wil indelen. Zo wil ik bijvoorbeeld alle foutmeldingen, alle waarschuwingen en alle informatieteksten bij elkaar groeperen. De handleiding van CodeIgniter raad in dat geval het volgende aan:</p>
<p><em>It&#8217;s a good practice to use a common prefix for all messages in a given file to avoid collisions with similarly named items in other files. For example, if you are creating error messages you might prefix them with error_</em></p>
<p>Dit is weer een leuke oplossing, maar ook niet goed genoeg voor hele grote websites. Een andere oplossing zou zijn om meerdere language files te maken per taal. Zo kan je bijvoorbeeld voor nederlands 3 bestanden aanmaken: nl_foutmeldingen_lang.php, nl_waarschuwingen_lang.php en nl_informatie_lang.php. Ook weer een tof alternatief, maar een oplossing die bijna niet onderhouden is.</p>
<p>Het mag dus wel duidelijk zijn dat er nood is aan een beter oplossing, en die gaan we nu maken.</p>
<h3>Hoe het zou moeten</h3>
<p>De ideale oplossing zou één bestand per taal zijn, waarin een meerdimensionale array staat die de teksten in categorieën onderverdeeld. Een klein voorbeeldje, in nl_lang.php staat het volgende:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is niet lang genoeg.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMaxLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is te lang.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameInvalid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam bevat ongeldige tekens.'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'warning'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwordMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je wachtwoord is niet lang genoeg.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'warning'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwordMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is te lang.'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'info'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'welcome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Welkom op mijn blog'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Het spreekt voor zich dat in en_lang.php exact hetzelfde staat, maar dan in het engels. Voor de_lang.php, fr_lang.php, etc. is dit uiteraard ook zo. Zoals je kan zien in bovenstaande code, zijn de teksten gegroepeerd. Een array voor alle foutmeldingen, een voor alle waarschuwingen en een voor alle informatieteksten.</p>
<p>Er rest nu nog één probleem. CodeIgniter kan standaard niet om met meerdimensionale arrays in de language files. We moeten dus de language class uitbreiden met een functie die de array wel kan uitlezen.</p>
<h3>De oplossing</h3>
<p>Wie al een beetje ervaring heeft met CodeIgniter, weet meteen dat voor problemen als deze de ideale oplossing al aanwezig is. Je kan in CI namelijk heel makkelijk bestaande klassen (of libraries in dit geval) overschrijven. Eerst maken we een nieuw bestand aan in /system/application/libraries en we noemen dit MY_Language.php. De inhoud van dit bestand is als volgt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> MY_Language <span style="color: #000000; font-weight: bold;">extends</span> CI_Language
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> line2<span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #000088;">$line</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$line</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$line</span> <span style="color: #339933;">===</span> <span style="color: #0000ff;">''</span> OR <span style="color: #000088;">$array</span> <span style="color: #339933;">===</span> <span style="color: #0000ff;">''</span> OR <span style="color: #339933;">!</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">language</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$line</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #009900; font-weight: bold;">FALSE</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">language</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$line</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$line</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Aangezien de naam van het bestand MY_ + een_bestaande_klasse is, zal deze automatisch worden geladen door CodeIgniter en moeten we ons hier verder geen zorgen meer om maken. We hebben nu een functie toegevoegd aan de Language klasse van CI, namelijk line2. We geven 2 parameters mee aan deze functie, de array waarin we willen zoeken en de regel die we willen ophalen. Ik heb voor dit voorbeeld deze functie line2 genoemd. In een realistische omgeving zou ik deze functie een kortere naam geven, bijvoorbeeld l2. Zo besparen we onszelf elke keer we deze functie aanroepen weer een beetje werk.</p>
<p>De functie gebruiken kan nu als volgt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Home <span style="color: #000000; font-weight: bold;">extends</span> Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Eerst laden we het bestand in ('mapnaam', 'bestandsnaam zonder _lang')</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Daarna printen we de regel 'usernameMinLength' uit de array 'error'</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line2</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'usernameMinLength'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Wanneer we dan een bezoekje brengen aan home/index krijgen we het volgende resultaat:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="plain" style="font-family:monospace;">Je gebruikersnaam is niet lang genoeg.</pre></td></tr></table></div>

<p>Exact wat we wilden bereiken. Missie geslaagd.</p>
<h3>Noot</h3>
<p>De code hierboven is bedoeld als voorbeeld en kan nog heel wat beter geschreven worden. Nu moeten we bijvoorbeeld nog steeds als onze language files in een aparte map plaatsen. dutch_lang.php in language/dutch/, english_lang.php in language/english/. Volgens de zelfde manier als hierboven kan de load functie van de Language klasse overschreven worden zodat we de language files rechtstreeks in language/ mogen plaatsen.</p>
<p>Ook kan de code hierboven worden uitgebreid om ondersteuning te bieden voor meerdimensionale array zodat je nog meer vrijheid krijgt. Beide ideeën laat ik als oefening voor de lezer <img src='http://finalfrag.be/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/05/arrays-in-language-files/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
